diff --git a/.tgs.yml b/.tgs.yml index 76a53577b50..dd18c3b8a25 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.1633" +byond: "515.1637" # 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 48090d7f212..bad8912ce93 100644 --- a/SQL/database_changelog.md +++ b/SQL/database_changelog.md @@ -2,21 +2,34 @@ 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.29 (5.26 for /tg/); The query to update the schema revision table is: +The latest database version is 5.30 (5.27 for /tg/); The query to update the schema revision table is: ```sql -INSERT INTO `schema_revision` (`major`, `minor`) VALUES (5, 29); +INSERT INTO `schema_revision` (`major`, `minor`) VALUES (5, 30); ``` or ```sql -INSERT INTO `SS13_schema_revision` (`major`, `minor`) VALUES (5, 29); +INSERT INTO `SS13_schema_revision` (`major`, `minor`) VALUES (5, 30); ``` In any query remember to add a prefix to the table names if you use one. - ----------------------------------------------------- -Version 5.29, 08 January 2024, by distributivgesetz +Version 5.30, 26 April 2024, by zephyrtfa +Add the ip intel whitelist table +```sql +DROP TABLE IF EXISTS `ipintel_whitelist`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ipintel_whitelist` ( + `ckey` varchar(32) NOT NULL, + `admin_ckey` varchar(32) NOT NULL, + PRIMARY KEY (`ckey`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +``` +----------------------------------------------------- +Version 5.29, 08 January 2024, by Useroth Add a new table for age-checking purposes. Optional if you don't ever intend to use the age prompt. ```sql diff --git a/SQL/tgstation_schema.sql b/SQL/tgstation_schema.sql index e7167f766df..fba7edfcb7a 100644 --- a/SQL/tgstation_schema.sql +++ b/SQL/tgstation_schema.sql @@ -220,6 +220,20 @@ CREATE TABLE `ipintel` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; /*!40101 SET character_set_client = @saved_cs_client */; +-- +-- Table structure for table `ipintel_whitelist` +-- + +DROP TABLE IF EXISTS `ipintel_whitelist`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ipintel_whitelist` ( + `ckey` varchar(32) NOT NULL, + `admin_ckey` varchar(32) 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 `legacy_population` -- diff --git a/SQL/tgstation_schema_prefixed.sql b/SQL/tgstation_schema_prefixed.sql index 3bf1da4759a..99a4191172c 100644 --- a/SQL/tgstation_schema_prefixed.sql +++ b/SQL/tgstation_schema_prefixed.sql @@ -218,6 +218,19 @@ CREATE TABLE `SS13_ipintel` ( KEY `idx_ipintel` (`ip`,`intel`,`date`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; /*!40101 SET character_set_client = @saved_cs_client */; +-- +-- Table structure for table `ipintel_whitelist` +-- + +DROP TABLE IF EXISTS `SS13_ipintel_whitelist`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `SS13_ipintel_whitelist` ( + `ckey` varchar(32) NOT NULL, + `admin_ckey` varchar(32) 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 `SS13_legacy_population` diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_hermit.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_hermit.dmm index df0bf1c0880..d596a823a6a 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_hermit.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_hermit.dmm @@ -75,7 +75,7 @@ /turf/open/floor/grass/fairy, /area/ruin/powered/hermit) "wf" = ( -/obj/item/gun/ballistic/rifle/boltaction/pipegun/prime, +/obj/item/gun/energy/laser/musket/prime, /obj/structure/table/wood, /obj/item/flashlight/lantern, /turf/open/floor/wood, diff --git a/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm b/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm index 84a3a2658d3..a7eac1fe1a8 100644 --- a/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm +++ b/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm @@ -1192,7 +1192,7 @@ }, /obj/effect/decal/cleanable/blood/gibs, /obj/item/organ/internal/brain, -/obj/item/skillchip/job/research_director, +/obj/item/skillchip/research_director, /obj/effect/turf_decal/tile/neutral/half{ dir = 4 }, diff --git a/_maps/deathmatch/maint_mania.dmm b/_maps/deathmatch/maint_mania.dmm index 8bb2522bc5d..5b23ac38feb 100644 --- a/_maps/deathmatch/maint_mania.dmm +++ b/_maps/deathmatch/maint_mania.dmm @@ -193,7 +193,7 @@ /turf/open/indestructible, /area/deathmatch) "zF" = ( -/obj/item/ammo_casing/shotgun/improvised, +/obj/effect/spawner/random/junk_shell, /turf/open/indestructible, /area/deathmatch) "AG" = ( diff --git a/_maps/map_files/Birdshot/birdshot.dmm b/_maps/map_files/Birdshot/birdshot.dmm index e692824965c..f531886834d 100644 --- a/_maps/map_files/Birdshot/birdshot.dmm +++ b/_maps/map_files/Birdshot/birdshot.dmm @@ -616,6 +616,14 @@ /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron/white/small, /area/station/science/ordnance/storage) +"apd" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible, +/turf/open/floor/iron, +/area/station/engineering/atmos) "api" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/dirt, @@ -625,6 +633,13 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron/white/small, /area/station/science/server) +"apj" = ( +/obj/effect/turf_decal/sand/plating, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/space) "apk" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/dark_red{ @@ -1682,6 +1697,14 @@ dir = 1 }, /area/station/hallway/secondary/exit/departure_lounge) +"aOb" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/light/cold/directional/north, +/obj/machinery/portable_atmospherics/canister, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "aOx" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/stone, @@ -2380,14 +2403,6 @@ /obj/machinery/light_switch/directional/west, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) -"bgN" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/helium_output{ - dir = 4; - chamber_id = "helium" - }, -/turf/open/floor/engine/helium, -/area/station/ai_monitored/turret_protected/ai) "bgQ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -2533,6 +2548,13 @@ /obj/structure/cable, /turf/open/floor/iron/small, /area/station/security/office) +"bkI" = ( +/obj/machinery/status_display/evac/directional/south, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "bkO" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 4; @@ -2759,13 +2781,6 @@ }, /turf/open/floor/circuit/green, /area/station/science/robotics/mechbay) -"boT" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "N2 to Pure" - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "boW" = ( /obj/structure/table/glass, /obj/machinery/status_display/ai/directional/south, @@ -2953,6 +2968,13 @@ /obj/vehicle/ridden/scooter/skateboard/hoverboard, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) +"brC" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/layer_manifold/yellow/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/engineering/atmos) "brD" = ( /obj/machinery/airalarm/directional/west, /obj/effect/turf_decal/tile/neutral{ @@ -3095,16 +3117,6 @@ dir = 8 }, /area/station/science/xenobiology) -"buD" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 5 - }, -/turf/open/space/basic, -/area/space/nearstation) "buO" = ( /obj/machinery/computer/slot_machine{ pixel_y = 2 @@ -3214,15 +3226,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/central) -"bym" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "byq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -3487,6 +3490,13 @@ }, /turf/open/floor/iron, /area/station/cargo/sorting) +"bDO" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + name = "N2 to Pure" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "bDQ" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -3697,12 +3707,11 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/engine/atmos) -"bJY" = ( +"bJN" = ( /obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/atmospherics/components/binary/pump/off/general/visible{ - dir = 4; - name = "Air to Pure" - }, +/obj/item/radio/intercom/directional/west, +/obj/machinery/status_display/evac/directional/south, +/obj/item/kirbyplants/random, /turf/open/floor/iron/dark, /area/station/engineering/atmos) "bJZ" = ( @@ -3932,13 +3941,6 @@ dir = 1 }, /area/station/hallway/secondary/dock) -"bPv" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ - dir = 9 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "bPU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/purple/visible, /turf/open/floor/iron, @@ -4286,16 +4288,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/central) -"bWP" = ( -/obj/machinery/atmospherics/components/binary/pump/off/general/visible/layer1{ - dir = 4; - name = "Plasma to Pure"; - color = "#BF40BF"; - piping_layer = 3; - icon_state = "pump_map-3" - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "bXb" = ( /obj/effect/turf_decal/sand/plating, /obj/effect/decal/cleanable/dirt/dust, @@ -4830,6 +4822,13 @@ }, /turf/open/floor/iron/white/small, /area/station/medical/storage) +"chb" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "chf" = ( /obj/effect/decal/cleanable/greenglow, /turf/open/floor/plating, @@ -5279,16 +5278,6 @@ }, /turf/open/floor/plating, /area/station/service/janitor) -"cry" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt/dust, -/obj/item/clothing/head/cone{ - pixel_x = -7; - pixel_y = 9 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "crE" = ( /obj/structure/window/spawner/directional/north, /turf/open/space/basic, @@ -5803,19 +5792,6 @@ }, /turf/open/misc/asteroid/airless, /area/space/nearstation) -"cCM" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ - dir = 10 - }, -/turf/open/space/basic, -/area/space/nearstation) "cCP" = ( /obj/structure/window/spawner/directional/south, /obj/structure/flora/bush/flowers_pp/style_random, @@ -5974,15 +5950,6 @@ }, /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai) -"cEU" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, -/obj/machinery/light_switch/directional/east, -/obj/item/clothing/head/cone{ - pixel_x = -7; - pixel_y = 11 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "cEX" = ( /obj/effect/turf_decal/siding/thinplating_new/terracotta{ dir = 1 @@ -6037,14 +6004,6 @@ }, /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai) -"cFI" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible, -/turf/open/floor/iron, -/area/station/engineering/atmos) "cFR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -6901,13 +6860,6 @@ }, /turf/open/floor/iron/dark/small, /area/station/command/heads_quarters/ce) -"daL" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/virologist, -/turf/open/floor/iron/white/small, -/area/station/medical/virology) "dba" = ( /obj/structure/chair/sofa/bench/left{ dir = 4 @@ -7555,6 +7507,13 @@ "dqO" = ( /turf/open/floor/iron/dark/small, /area/station/security/checkpoint/customs/auxiliary) +"dqV" = ( +/obj/effect/turf_decal/sand/plating, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer4{ + dir = 5 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "dqX" = ( /obj/structure/reagent_dispensers/wall/peppertank/directional/north, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -7718,13 +7677,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/science/genetics) -"dtH" = ( -/obj/effect/turf_decal/sand/plating, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) "dua" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/visible{ dir = 4 @@ -8328,13 +8280,6 @@ }, /turf/open/space/basic, /area/station/engineering/atmos/space_catwalk) -"dIK" = ( -/obj/effect/turf_decal/sand/plating, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) "dIN" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -9001,14 +8946,6 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/white/small, /area/station/security/warden) -"dXL" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 10 - }, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/iron, -/area/station/engineering/atmos) "dXO" = ( /obj/effect/spawner/structure/window/reinforced/tinted, /obj/structure/disposalpipe/segment{ @@ -9128,6 +9065,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) +"dYY" = ( +/obj/machinery/light/cold/dim/directional/north, +/obj/machinery/portable_atmospherics/canister, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "dZa" = ( /obj/structure/table/reinforced, /obj/machinery/camera/directional/west, @@ -9195,6 +9137,14 @@ }, /turf/open/floor/iron, /area/station/maintenance/department/medical/central) +"dZX" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/components/binary/pump/off/general/visible{ + dir = 4; + name = "Air to Pure" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "dZZ" = ( /obj/structure/cable/layer3, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, @@ -10260,15 +10210,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"ewl" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 10 - }, -/obj/structure/cable, -/obj/machinery/firealarm/directional/north, -/obj/machinery/space_heater, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "ewo" = ( /obj/effect/turf_decal/box/corners{ dir = 4 @@ -10302,6 +10243,16 @@ /obj/machinery/air_sensor/oxygen_tank, /turf/open/floor/engine/o2, /area/station/engineering/atmos/space_catwalk) +"exA" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/clothing/head/cone{ + pixel_x = -7; + pixel_y = 9 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "exE" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -12120,13 +12071,6 @@ dir = 1 }, /area/station/hallway/secondary/dock) -"fjt" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "fju" = ( /obj/structure/closet/emcloset, /obj/effect/turf_decal/bot, @@ -12642,6 +12586,13 @@ }, /turf/open/space/basic, /area/space) +"fuS" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/landmark/start/virologist, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) "fuT" = ( /obj/effect/turf_decal/tile/brown/opposingcorners, /obj/machinery/atmospherics/pipe/smart/manifold/general/visible{ @@ -12666,6 +12617,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor, /area/station/command/heads_quarters/ce) +"fvu" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/chair/office/light{ + dir = 8 + }, +/obj/effect/landmark/start/virologist, +/turf/open/floor/iron/white, +/area/station/medical/virology) "fvz" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -13372,19 +13336,6 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/grimy, /area/station/science/cubicle) -"fIi" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"fJe" = ( -/obj/effect/landmark/start/virologist, -/turf/open/floor/iron/showroomfloor, -/area/station/medical/virology) "fJl" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -13406,6 +13357,13 @@ /obj/effect/mapping_helpers/airlock/access/all/command/minisat, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/ai_monitored/turret_protected/aisat/teleporter) +"fJt" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/heater/on{ + dir = 8; + initialize_directions = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "fJK" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -14266,14 +14224,6 @@ /obj/structure/tram, /turf/open/floor/tram, /area/station/security/tram) -"fXI" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/tank_holder/extinguisher/advanced, -/turf/open/floor/iron, -/area/station/engineering/atmos) "fXJ" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -15603,11 +15553,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/hallway/secondary/dock) -"gyo" = ( -/obj/machinery/light/cold/dim/directional/north, -/obj/machinery/portable_atmospherics/canister, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "gyr" = ( /obj/structure/chair/stool/directional/west, /turf/open/floor/iron/smooth, @@ -15863,6 +15808,13 @@ /obj/machinery/light/floor, /turf/open/floor/iron/smooth, /area/station/hallway/secondary/command) +"gCP" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible, +/turf/open/floor/iron, +/area/station/engineering/atmos) "gCR" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, /obj/effect/decal/cleanable/dirt, @@ -17077,13 +17029,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/engineering/break_room) -"gWx" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "N2O to Pure" - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "gWB" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -18522,6 +18467,13 @@ /obj/effect/turf_decal/stripes/white/line, /turf/open/floor/plating, /area/station/cargo/miningoffice) +"hsL" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ + dir = 6 + }, +/turf/open/space/basic, +/area/space/nearstation) "hsO" = ( /obj/structure/cable, /obj/effect/spawner/structure/window, @@ -19298,15 +19250,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/smooth, /area/station/hallway/secondary/command) -"hEW" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold/purple/visible{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "hFb" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -20327,6 +20270,13 @@ /obj/machinery/brm, /turf/open/floor/iron, /area/station/cargo/miningfoundry) +"hZf" = ( +/obj/effect/turf_decal/sand/plating, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "hZP" = ( /obj/structure/cable, /obj/structure/sign/poster/official/random/directional/north, @@ -20427,13 +20377,6 @@ /obj/effect/decal/cleanable/glass/plasma, /turf/open/floor/engine, /area/station/engineering/atmos) -"iba" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/item/kirbyplants/random, -/turf/open/floor/iron, -/area/station/engineering/atmos) "ibe" = ( /obj/effect/turf_decal/bot_white, /obj/structure/closet/crate/freezer, @@ -20897,6 +20840,15 @@ /obj/machinery/photobooth, /turf/open/floor/iron/textured_large, /area/station/hallway/primary/central/fore) +"ijP" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "ijV" = ( /turf/open/misc/asteroid, /area/station/maintenance/department/engine) @@ -21699,6 +21651,15 @@ /obj/effect/decal/cleanable/glass/plastitanium, /turf/open/floor/plating, /area/station/maintenance/fore/greater) +"ivT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "ivX" = ( /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, @@ -22333,13 +22294,6 @@ }, /turf/open/floor/iron/dark/textured_edge, /area/station/command/heads_quarters/hop) -"iIC" = ( -/obj/machinery/status_display/evac/directional/south, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "iIN" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -24523,6 +24477,19 @@ /obj/effect/mapping_helpers/airlock/access/all/supply/general, /turf/open/floor/catwalk_floor/iron_dark, /area/station/commons/storage/tools) +"jul" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ + dir = 10 + }, +/turf/open/space/basic, +/area/space/nearstation) "juF" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/cable, @@ -25305,19 +25272,6 @@ /obj/machinery/light/floor, /turf/open/floor/iron/smooth, /area/station/service/library) -"jGb" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "South Ports to Wastes" - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "jGc" = ( /obj/structure/window/spawner/directional/east, /turf/open/floor/iron/showroomfloor, @@ -25783,6 +25737,10 @@ }, /turf/open/floor/iron/small, /area/station/engineering/atmos/pumproom) +"jMB" = ( +/obj/effect/landmark/start/virologist, +/turf/open/floor/iron/showroomfloor, +/area/station/medical/virology) "jMC" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/on{ dir = 8 @@ -25937,13 +25895,6 @@ /obj/machinery/status_display/evac/directional/east, /turf/open/misc/sandy_dirt, /area/station/hallway/primary/central/fore) -"jOy" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/heater/on{ - dir = 8; - initialize_directions = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "jOF" = ( /obj/item/kirbyplants/random, /obj/machinery/light_switch/directional/west, @@ -26637,13 +26588,6 @@ /obj/structure/bookcase/random, /turf/open/misc/asteroid, /area/station/service/library/abandoned) -"kcf" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, -/turf/open/floor/iron, -/area/station/engineering/atmos) "kci" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -26782,19 +26726,6 @@ "kev" = ( /turf/closed/wall, /area/station/hallway/secondary/spacebridge) -"keK" = ( -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/structure/chair/office/light{ - dir = 8 - }, -/obj/effect/landmark/start/virologist, -/turf/open/floor/iron/white, -/area/station/medical/virology) "keS" = ( /obj/effect/turf_decal/siding/white{ dir = 5 @@ -27059,6 +26990,13 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"kiF" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/start/virologist, +/turf/open/floor/iron/white/small, +/area/station/medical/virology) "kiG" = ( /obj/structure/broken_flooring/singular/directional/east, /obj/machinery/recharge_station, @@ -27461,6 +27399,28 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/plating, /area/station/engineering/supermatter/room) +"kpe" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 6 + }, +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer4{ + dir = 8 + }, +/turf/open/space/basic, +/area/station/engineering/atmos/space_catwalk) "kph" = ( /obj/structure/railing, /obj/machinery/light/cold/directional/north, @@ -27974,6 +27934,13 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/white, /area/station/science/robotics/augments) +"kwH" = ( +/obj/effect/turf_decal/sand/plating, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "kwW" = ( /obj/machinery/light/small/directional/west, /turf/open/floor/iron/smooth, @@ -28403,14 +28370,6 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"kED" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/unary/thermomachine/heater/on{ - dir = 8; - initialize_directions = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "kEF" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/siding/white{ @@ -29179,15 +29138,6 @@ "kQt" = ( /turf/closed/wall/r_wall, /area/station/maintenance/starboard/aft) -"kQy" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "kQA" = ( /obj/structure/table, /obj/machinery/microwave{ @@ -29531,6 +29481,11 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/small, /area/station/engineering/engine_smes) +"kXf" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "kXj" = ( /obj/machinery/suit_storage_unit/engine, /turf/open/floor/plating/rust, @@ -31894,6 +31849,13 @@ }, /turf/open/misc/sandy_dirt, /area/station/hallway/primary/central/fore) +"lGq" = ( +/obj/structure/fluff/broken_canister_frame, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "lGr" = ( /obj/effect/turf_decal/siding/brown{ dir = 6 @@ -32260,6 +32222,16 @@ /obj/machinery/status_display/evac/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/fore) +"lLE" = ( +/obj/effect/turf_decal/sand/plating, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer4{ + dir = 10 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "lLH" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -32580,13 +32552,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/commons/dorms) -"lOI" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ - dir = 6 - }, -/turf/open/space/basic, -/area/space/nearstation) "lOM" = ( /obj/structure/table, /obj/item/folder, @@ -33044,15 +33009,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"lVM" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "lVN" = ( /obj/effect/spawner/random/structure/crate, /obj/effect/spawner/random/maintenance, @@ -33708,18 +33664,20 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/department/electrical) +"mfV" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "mgt" = ( /obj/machinery/vending/boozeomat, /obj/machinery/firealarm/directional/south, /turf/open/floor/wood/large, /area/station/command/heads_quarters/captain/private) -"mgw" = ( -/obj/effect/turf_decal/sand/plating, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/space) "mgz" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -34249,9 +34207,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/cargo/storage) -"moM" = ( -/turf/open/floor/iron, -/area/station/engineering/atmos) "mpk" = ( /obj/machinery/airalarm/directional/south, /turf/open/floor/circuit/green, @@ -34919,13 +34874,6 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/wood, /area/station/command/heads_quarters/qm) -"mCe" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/item/radio/intercom/directional/west, -/obj/machinery/status_display/evac/directional/south, -/obj/item/kirbyplants/random, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "mCf" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/external/glass{ @@ -35167,6 +35115,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"mFD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/tank_holder/extinguisher/advanced, +/turf/open/floor/iron, +/area/station/engineering/atmos) "mFG" = ( /obj/machinery/telecomms/processor/preset_four, /obj/effect/decal/cleanable/dirt, @@ -35484,6 +35440,12 @@ /obj/machinery/disposal/bin, /turf/open/floor/iron/cafeteria, /area/station/service/cafeteria) +"mKK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "mKV" = ( /obj/effect/turf_decal/siding/blue{ dir = 5 @@ -36172,12 +36134,26 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"mXm" = ( +/obj/machinery/atmospherics/components/binary/pump/off/general/visible{ + dir = 4; + name = "CO2 to Pure" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "mXt" = ( /obj/machinery/rnd/production/techfab/department/medical, /obj/effect/turf_decal/stripes/box, /obj/machinery/status_display/evac/directional/north, /turf/open/floor/iron/dark/small, /area/station/medical/storage) +"mXx" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + name = "N2O to Pure" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "mXD" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 8 @@ -36739,13 +36715,6 @@ /obj/effect/landmark/start/atmospheric_technician, /turf/open/floor/iron/smooth, /area/station/engineering/atmos) -"nhh" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible, -/turf/open/floor/iron, -/area/station/engineering/atmos) "nhs" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, @@ -38520,6 +38489,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white/corner, /area/station/science/xenobiology) +"nID" = ( +/obj/effect/turf_decal/sand/plating, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) "nIJ" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -39605,6 +39581,15 @@ dir = 1 }, /area/station/hallway/primary/central/fore) +"obd" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 10 + }, +/obj/structure/cable, +/obj/machinery/firealarm/directional/north, +/obj/machinery/space_heater, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "obe" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/disposalpipe/segment{ @@ -40574,14 +40559,6 @@ "orb" = ( /turf/closed/wall, /area/station/engineering/main) -"orq" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/bot, -/obj/machinery/microwave{ - pixel_y = 5 - }, -/turf/open/floor/iron/small, -/area/station/engineering/break_room) "orC" = ( /obj/structure/cable, /turf/open/floor/iron/smooth, @@ -42300,6 +42277,16 @@ }, /turf/open/floor/iron/dark, /area/station/science/genetics) +"oTY" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 5 + }, +/turf/open/space/basic, +/area/space/nearstation) "oTZ" = ( /obj/structure/table, /turf/open/floor/plating, @@ -43287,6 +43274,9 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/tram, /area/station/maintenance/department/medical/central) +"pjk" = ( +/turf/open/floor/iron, +/area/station/engineering/atmos) "pjn" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/dna_scannernew, @@ -44618,6 +44608,13 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/command/heads_quarters/qm) +"pBH" = ( +/obj/machinery/atmospherics/pipe/smart/simple/supply/visible/layer2{ + dir = 6 + }, +/obj/machinery/meter/layer2, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) "pBJ" = ( /obj/effect/mapping_helpers/broken_floor, /obj/machinery/airalarm/directional/north, @@ -45219,6 +45216,14 @@ /obj/structure/steam_vent, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"pJT" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 6 + }, +/turf/open/space/basic, +/area/space/nearstation) "pKg" = ( /obj/effect/turf_decal/siding/dark{ dir = 10 @@ -46273,13 +46278,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"pXD" = ( -/obj/machinery/atmospherics/components/binary/pump/off/general/visible{ - dir = 4; - name = "O2 to pure" - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "pXL" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -47584,6 +47582,13 @@ /obj/machinery/status_display/ai/directional/north, /turf/open/floor/iron/diagonal, /area/station/hallway/primary/central/aft) +"qqr" = ( +/obj/machinery/atmospherics/components/binary/pump/off/general/visible{ + dir = 4; + name = "O2 to pure" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "qqx" = ( /obj/structure/bed/maint, /turf/open/floor/eighties/red, @@ -48349,6 +48354,14 @@ /obj/structure/table, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"qAQ" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/helium_output{ + dir = 8; + name = "N2O tank output inlet" + }, +/turf/open/floor/engine/n2o, +/area/station/ai_monitored/turret_protected/ai) "qAR" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 4 @@ -48495,11 +48508,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/wood/large, /area/station/service/chapel) -"qCk" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "qCq" = ( /obj/structure/cable, /obj/structure/window/reinforced/spawner/directional/north, @@ -49195,6 +49203,13 @@ /obj/structure/cable, /turf/open/floor/iron/smooth, /area/station/engineering/engine_smes) +"qME" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ + dir = 5 + }, +/turf/open/space/basic, +/area/space/nearstation) "qMG" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/cable, @@ -49320,13 +49335,6 @@ "qPN" = ( /turf/closed/wall/r_wall, /area/station/security/prison/safe) -"qPO" = ( -/obj/machinery/atmospherics/pipe/smart/simple/supply/visible/layer2{ - dir = 6 - }, -/obj/machinery/meter, -/turf/open/floor/iron, -/area/station/engineering/atmos/pumproom) "qQg" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -50043,13 +50051,6 @@ }, /turf/open/floor/plating, /area/station/security/brig/entrance) -"qYL" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/landmark/start/virologist, -/turf/open/floor/iron/white, -/area/station/medical/medbay/aft) "qZe" = ( /obj/effect/turf_decal/siding/white/corner{ dir = 1 @@ -50145,12 +50146,6 @@ }, /turf/open/floor/iron/smooth_large, /area/station/science/ordnance/storage) -"rab" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "raf" = ( /obj/structure/reagent_dispensers/water_cooler, /obj/effect/turf_decal/tile/dark_red/opposingcorners, @@ -50786,13 +50781,6 @@ /obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/iron/grimy, /area/station/commons/vacant_room/office) -"ric" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "rie" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/start/cargo_technician, @@ -50941,6 +50929,15 @@ }, /turf/open/floor/wood, /area/station/service/theater) +"rkk" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "rkr" = ( /obj/structure/table_frame, /obj/effect/decal/cleanable/molten_object, @@ -51335,6 +51332,22 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"rqV" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer4{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 9 + }, +/turf/open/space/basic, +/area/space/nearstation) "rrb" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/catwalk_floor/iron_dark, @@ -51787,6 +51800,13 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"rxs" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/iron, +/area/station/engineering/atmos) "rxu" = ( /obj/structure/table, /obj/machinery/airalarm/directional/south, @@ -53258,13 +53278,6 @@ dir = 1 }, /area/station/hallway/secondary/exit/departure_lounge) -"rRc" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/layer_manifold/yellow/visible{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/engineering/atmos) "rRf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -53587,6 +53600,15 @@ }, /turf/open/floor/iron/smooth_large, /area/station/science/auxlab/firing_range) +"rVA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold/purple/visible{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "rVH" = ( /obj/effect/turf_decal/tile/blue/fourcorners, /obj/structure/table/glass, @@ -54026,28 +54048,6 @@ /obj/effect/landmark/start/research_director, /turf/open/floor/iron/grimy, /area/station/science/cubicle) -"sch" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 6 - }, -/obj/structure/railing/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer4{ - dir = 8 - }, -/turf/open/space/basic, -/area/station/engineering/atmos/space_catwalk) "scj" = ( /turf/closed/wall/r_wall, /area/station/science/lower) @@ -54197,13 +54197,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/space/basic, /area/space/nearstation) -"seW" = ( -/obj/structure/fluff/broken_canister_frame, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "sfd" = ( /obj/effect/turf_decal/siding/blue{ dir = 10 @@ -54779,18 +54772,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"snf" = ( -/obj/effect/gibspawner/human, -/obj/structure/table/optable{ - desc = "A cold, hard place for your final rest."; - name = "Morgue Slab" - }, -/mob/living/carbon/human/species/monkey/humand_legged{ - name = "Charles"; - real_name = "Charles" - }, -/turf/open/floor/iron/white/diagonal, -/area/station/maintenance/department/science/xenobiology) "snj" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/disposalpipe/segment{ @@ -55081,6 +55062,14 @@ }, /turf/open/floor/iron/smooth, /area/station/security/checkpoint/customs/auxiliary) +"sqB" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/unary/thermomachine/heater/on{ + dir = 8; + initialize_directions = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "sqV" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/chair/sofa/bench/left{ @@ -56040,14 +56029,6 @@ }, /turf/open/floor/engine, /area/station/science/cytology) -"sEt" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/helium_output{ - dir = 8; - name = "N2O tank output inlet" - }, -/turf/open/floor/engine/n2o, -/area/station/ai_monitored/turret_protected/ai) "sEz" = ( /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, @@ -58261,6 +58242,13 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/maintenance/department/engine/atmos) +"tnH" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 4 + }, +/obj/effect/landmark/start/atmospheric_technician, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "tnO" = ( /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, @@ -58615,14 +58603,6 @@ /obj/machinery/electrolyzer, /turf/open/floor/catwalk_floor, /area/station/maintenance/disposal/incinerator) -"ttf" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/obj/machinery/light/cold/directional/north, -/obj/machinery/portable_atmospherics/canister, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "ttg" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -60270,6 +60250,15 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"tSg" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, +/obj/machinery/light_switch/directional/east, +/obj/item/clothing/head/cone{ + pixel_x = -7; + pixel_y = 11 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "tSh" = ( /obj/item/kirbyplants/random, /turf/open/floor/wood, @@ -61400,14 +61389,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood/parquet, /area/station/medical/psychology) -"ugN" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 6 - }, -/turf/open/space/basic, -/area/space/nearstation) "ugX" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -61699,6 +61680,13 @@ /obj/effect/mapping_helpers/airlock/access/all/medical/general, /turf/open/floor/iron/white/small, /area/station/medical/cryo) +"ulf" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, +/turf/open/floor/iron, +/area/station/engineering/atmos) "ull" = ( /obj/machinery/light/cold/directional/west, /turf/open/floor/iron, @@ -61734,6 +61722,19 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/port/lesser) +"umn" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "South Ports to Wastes" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "umr" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/white/line{ @@ -63773,16 +63774,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/dark, /area/station/medical/pharmacy) -"uQe" = ( -/obj/effect/turf_decal/sand/plating, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer4{ - dir = 10 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) "uQf" = ( /obj/structure/bed/medical/emergency, /obj/structure/extinguisher_cabinet/directional/west, @@ -65749,13 +65740,6 @@ }, /turf/open/space/basic, /area/space/nearstation) -"vrU" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/obj/effect/landmark/start/atmospheric_technician, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "vrW" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -66297,6 +66281,14 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/wood/parquet, /area/station/service/library) +"vzK" = ( +/obj/machinery/light/small/directional/west, +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/helium_output{ + dir = 4; + chamber_id = "helium" + }, +/turf/open/floor/engine/helium, +/area/station/ai_monitored/turret_protected/ai) "vzM" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/brown/full, @@ -67435,6 +67427,13 @@ /obj/effect/spawner/random/trash, /turf/open/floor/plating, /area/station/maintenance/starboard/central) +"vPY" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "vQk" = ( /obj/effect/spawner/random/structure/crate, /obj/machinery/computer/security/telescreen/entertainment/directional/east, @@ -67706,6 +67705,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/security/prison) +"vUh" = ( +/obj/machinery/atmospherics/components/binary/pump/off/general/visible/layer1{ + dir = 4; + name = "Plasma to Pure"; + color = "#BF40BF"; + piping_layer = 3; + icon_state = "pump_map-3" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) "vUq" = ( /obj/machinery/restaurant_portal/bar, /obj/machinery/firealarm/directional/west, @@ -68405,13 +68414,6 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron/dark/small, /area/station/engineering/lobby) -"weJ" = ( -/obj/effect/turf_decal/sand/plating, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer4{ - dir = 5 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) "weT" = ( /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, @@ -68737,13 +68739,6 @@ /obj/effect/landmark/start/librarian, /turf/open/floor/wood/parquet, /area/station/service/library) -"wiZ" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ - dir = 5 - }, -/turf/open/space/basic, -/area/space/nearstation) "wja" = ( /turf/closed/wall/r_wall, /area/station/commons/toilet/auxiliary) @@ -68885,6 +68880,13 @@ /obj/structure/flora/bush/flowers_pp/style_random, /turf/open/floor/grass, /area/station/service/chapel) +"wlS" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "wlU" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -70542,17 +70544,6 @@ /obj/structure/bookcase/random, /turf/open/floor/wood/parquet, /area/station/service/library) -"wKw" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/smart/simple/general/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "wKy" = ( /obj/structure/railing{ dir = 1 @@ -70729,6 +70720,17 @@ }, /turf/open/floor/iron/smooth_large, /area/station/science/robotics/mechbay) +"wNi" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/smart/simple/general/visible{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) "wNv" = ( /obj/effect/landmark/navigate_destination/bridge, /turf/open/floor/iron/smooth_half, @@ -71432,6 +71434,14 @@ dir = 1 }, /area/station/hallway/secondary/construction) +"wWP" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/station/engineering/atmos) "wWR" = ( /obj/structure/table, /obj/item/clothing/gloves/color/orange, @@ -71773,6 +71783,18 @@ /obj/structure/grille, /turf/closed/wall/mineral/titanium/nodiagonal, /area/station/engineering/atmos) +"xai" = ( +/obj/effect/gibspawner/human, +/obj/structure/table/optable{ + desc = "A cold, hard place for your final rest."; + name = "Morgue Slab" + }, +/mob/living/carbon/human/species/monkey/humand_legged{ + name = "Charles"; + real_name = "Charles" + }, +/turf/open/floor/iron/white/diagonal, +/area/station/maintenance/department/science/xenobiology) "xaj" = ( /obj/machinery/light/cold/directional/west, /obj/effect/decal/cleanable/dirt, @@ -72363,13 +72385,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/service/chapel/office) -"xhy" = ( -/obj/effect/turf_decal/sand/plating, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) "xhA" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -75099,13 +75114,6 @@ /obj/structure/flora/tree/jungle/small/style_random, /turf/open/floor/grass, /area/station/service/chapel) -"xPU" = ( -/obj/machinery/atmospherics/components/binary/pump/off/general/visible{ - dir = 4; - name = "CO2 to Pure" - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "xPW" = ( /obj/item/kirbyplants/random/fullysynthetic, /turf/open/floor/wood/parquet, @@ -75502,22 +75510,6 @@ }, /turf/open/floor/engine, /area/station/science/cytology) -"xTS" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 9 - }, -/turf/open/space/basic, -/area/space/nearstation) "xTT" = ( /obj/machinery/door/airlock/research/glass{ name = "Cubicle" @@ -75801,6 +75793,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"xXl" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/bot, +/obj/machinery/microwave{ + pixel_y = 5 + }, +/turf/open/floor/iron/small, +/area/station/engineering/break_room) "xXr" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -85583,7 +85583,7 @@ dDB dDB jhz xQZ -sch +kpe dDB dDB dDB @@ -85818,9 +85818,9 @@ tYT tYT dDB dDB -cCM -buD -wiZ +jul +oTY +qME dDB dDB tYT @@ -85838,9 +85838,9 @@ tYT tYT dDB dDB -lOI -ugN -xTS +hsL +pJT +rqV dDB dDB dDB @@ -86075,9 +86075,9 @@ wBo giq wBo vmL -mgw -xhy -dIK +apj +kwH +nID vmL ybO tYT @@ -86095,10 +86095,10 @@ aJq tYT ybO vmL -dtH -xhy -uQe -weJ +hZf +kwH +lLE +dqV ybO aJq aJq @@ -86332,9 +86332,9 @@ drw gvB wBo ybO -rRc -rRc -rRc +brC +brC +brC ybO ybO aJq @@ -86352,9 +86352,9 @@ aJq aJq ybO ybO -rRc -rRc -rRc +brC +brC +brC pfx ybO akZ @@ -86589,10 +86589,10 @@ ylK qBD gKs hXt -xPU -gWx -bWP -mCe +mXm +mXx +vUh +bJN hYC pwv pwv @@ -86609,10 +86609,10 @@ pwv pwv hYC jrb -bJY -boT -pXD -iIC +dZX +bDO +qqr +bkI ybO gBh gBh @@ -86846,9 +86846,9 @@ jwC vDD gKs ydI -fIi -kQy -nhh +ijP +ivT +gCP sWE hYC gjP @@ -86865,10 +86865,10 @@ lMg tSi vnz hYC -gyo -fIi -kcf -nhh +dYY +ijP +ulf +gCP nkp kvb gBh @@ -87103,9 +87103,9 @@ fYo jVI bBd sUk -cFI -jOy -fjt +apd +fJt +chb hqm uhh gCR @@ -87124,8 +87124,8 @@ qxz mRA hvZ xHT -jOy -ric +fJt +vPY wPt bNq cmf @@ -87361,8 +87361,8 @@ vtw gKs mFZ exE -moM -dXL +pjk +wWP dlk qUN paW @@ -87617,10 +87617,10 @@ jdU ihj gKs pIB -wKw +wNi tFB -rab -vrU +mKK +tnH vcR fxV wJn @@ -87637,9 +87637,9 @@ eOP qNN fFu oDa -jGb +umn bPU -bPv +wlS akU bNq vlC @@ -87874,10 +87874,10 @@ jNL fEr pUK vjK -hEW +rVA bPU yii -qCk +kXf hvo kQr bNg @@ -87895,8 +87895,8 @@ kQr etX wXV xHT -seW -kED +lGq +sqB fJP eDe viw @@ -88130,10 +88130,10 @@ gKs fpF gKs gKs -ttf +aOb utf -lVM -fXI +mfV +mFD mrW hYC wVh @@ -88151,9 +88151,9 @@ nIL lNC hYC wyU -bym +rkk blZ -iba +rxs upf bNq gBh @@ -88387,10 +88387,10 @@ dwP jNr tsR gKs -ewl -cry +obd +exA vAb -cEU +tSg nYP xae qol @@ -89432,7 +89432,7 @@ uGB vja ssP ioN -qPO +pBH oYN dNM lPw @@ -94823,7 +94823,7 @@ thb oxc rwJ wnR -orq +xXl gKL gdA xuv @@ -102023,7 +102023,7 @@ fpY oRm uTA apZ -bgN +vzK oCF uTA fpY @@ -104079,7 +104079,7 @@ fpY fpY uTA bat -sEt +qAQ bat uTA fpY @@ -106249,7 +106249,7 @@ tRc tRc tRc tRc -qYL +fuS dHT sSQ sSQ @@ -107024,7 +107024,7 @@ bUv cSk gLb nlS -daL +kiF gpM sSQ hrF @@ -108562,12 +108562,12 @@ jrk gIF wYA bpS -fJe +jMB nYk vVP xAA hgf -keK +fvu uGj wgL oiA @@ -113423,7 +113423,7 @@ dDB blb dDB ldq -snf +xai vXn ldq ldq diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index c65fd246769..c17bfeb4106 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -4038,11 +4038,6 @@ }, /turf/open/floor/iron/white, /area/mine/laborcamp) -"bmr" = ( -/obj/structure/cable, -/obj/machinery/power/smes/engineering, -/turf/open/floor/plating, -/area/station/maintenance/department/electrical) "bmv" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -30750,6 +30745,10 @@ /obj/structure/closet/secure_closet/captains, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain) +"jzs" = ( +/obj/machinery/power/smes/engineering, +/turf/open/floor/plating, +/area/station/maintenance/department/electrical) "jzy" = ( /obj/machinery/computer/exodrone_control_console{ dir = 1 @@ -75026,10 +75025,6 @@ "wZj" = ( /turf/open/floor/iron/dark/textured, /area/station/security/warden) -"wZn" = ( -/obj/machinery/power/smes/engineering, -/turf/open/floor/plating, -/area/station/maintenance/department/electrical) "wZp" = ( /obj/item/storage/toolbox/electrical{ pixel_x = 4; @@ -256523,7 +256518,7 @@ qAS fUc jaX glI -bmr +jzs kKL kKL mbG @@ -257551,7 +257546,7 @@ dvS pwd glI jzP -wZn +jzs lUC tXV kvX diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 26daa4d97b4..3f4aac110dc 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -230,16 +230,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/iron/dark/textured, /area/station/medical/cryo) -"aeA" = ( -/obj/structure/cable, -/obj/structure/chair/office/light, -/obj/effect/landmark/start/virologist, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/virology) "afj" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -5729,10 +5719,6 @@ "bYz" = ( /turf/open/floor/circuit, /area/station/maintenance/port/aft) -"bYN" = ( -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) "bZb" = ( /obj/structure/table, /obj/machinery/button/door{ @@ -8864,18 +8850,6 @@ /obj/effect/turf_decal/bot_white, /turf/open/floor/iron, /area/station/cargo/storage) -"dkj" = ( -/obj/structure/table/glass, -/obj/machinery/reagentgrinder{ - pixel_y = 8 - }, -/obj/item/toy/figure/virologist{ - pixel_x = -8 - }, -/obj/effect/turf_decal/tile/green/half/contrasted, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/white, -/area/station/medical/virology) "dkx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, @@ -11486,6 +11460,16 @@ /obj/item/storage/backpack/duffelbag/sec, /turf/open/floor/iron/dark, /area/station/security/office) +"eiZ" = ( +/obj/item/radio/intercom/directional/east, +/obj/effect/turf_decal/siding/white{ + dir = 5 + }, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/water, +/area/station/service/hydroponics/garden) "eje" = ( /obj/structure/chair{ dir = 4 @@ -13917,6 +13901,22 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) +"fdi" = ( +/obj/machinery/disposal/bin, +/obj/machinery/camera/directional/east{ + c_tag = "Garden" + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/siding/wideplating_new, +/obj/structure/railing, +/obj/effect/turf_decal/tile/green/half/contrasted, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) "fdl" = ( /obj/effect/decal/cleanable/food/flour, /obj/effect/turf_decal/tile/red/opposingcorners, @@ -15890,6 +15890,20 @@ /obj/machinery/gateway/centerstation, /turf/open/floor/iron/dark, /area/station/command/gateway) +"fPj" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/siding/wideplating_new/corner, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) "fPw" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, /turf/open/floor/iron/dark, @@ -17155,18 +17169,6 @@ /obj/structure/chair/wood/wings, /turf/open/floor/carpet, /area/station/service/theater) -"gpk" = ( -/obj/structure/table, -/obj/item/hatchet, -/obj/item/cultivator, -/obj/item/crowbar, -/obj/item/reagent_containers/cup/watering_can, -/obj/item/plant_analyzer, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) "gpv" = ( /obj/structure/cable, /obj/machinery/door/airlock{ @@ -17232,6 +17234,16 @@ }, /turf/open/floor/plating, /area/station/science/genetics) +"gqw" = ( +/obj/structure/window/spawner/directional/west, +/obj/structure/window/spawner/directional/south, +/mob/living/basic/chicken{ + name = "Kentucky"; + real_name = "Kentucky" + }, +/obj/structure/flora/grass/jungle/b/style_random, +/turf/open/floor/grass, +/area/station/service/hydroponics/garden) "gqA" = ( /obj/machinery/suit_storage_unit/standard_unit, /obj/machinery/button/door/directional/south{ @@ -19810,6 +19822,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/aft/lesser) +"hlG" = ( +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/turf/open/water, +/area/station/service/hydroponics/garden) "hlN" = ( /obj/structure/frame/machine{ anchored = 1 @@ -20777,6 +20795,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"hDr" = ( +/obj/structure/chair/office/light{ + dir = 8 + }, +/obj/effect/landmark/start/virologist, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/medical/virology) "hDE" = ( /obj/effect/turf_decal/trimline/red/filled/line, /turf/open/floor/iron/white, @@ -23146,12 +23172,6 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"ivb" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) "ivc" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -24028,6 +24048,11 @@ }, /turf/open/space, /area/space/nearstation) +"iLj" = ( +/obj/structure/window/spawner/directional/west, +/obj/structure/flora/rock/pile, +/turf/open/floor/grass, +/area/station/service/hydroponics/garden) "iLk" = ( /obj/effect/turf_decal/plaque{ icon_state = "L12" @@ -25138,6 +25163,17 @@ /obj/item/shard, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"jbN" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/siding/wideplating_new, +/obj/structure/railing, +/obj/effect/turf_decal/tile/green/half/contrasted, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) "jcc" = ( /obj/structure/rack, /obj/effect/turf_decal/tile/red/half/contrasted{ @@ -26943,11 +26979,6 @@ /obj/structure/table/wood/poker, /turf/open/floor/wood, /area/station/commons/lounge) -"jGE" = ( -/obj/structure/window/spawner/directional/west, -/obj/structure/window/spawner/directional/north, -/turf/open/floor/grass, -/area/station/service/hydroponics/garden) "jGG" = ( /obj/machinery/holopad, /obj/effect/turf_decal/box/white{ @@ -28040,13 +28071,6 @@ /obj/machinery/status_display/evac/directional/east, /turf/open/floor/iron/dark, /area/station/command/gateway) -"jYu" = ( -/mob/living/basic/cow{ - name = "Betsy"; - real_name = "Betsy" - }, -/turf/open/floor/grass, -/area/station/service/hydroponics/garden) "jYv" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/smart/simple/green/visible, @@ -29013,16 +29037,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/security/prison) -"krt" = ( -/obj/item/storage/bag/plants/portaseeder, -/obj/structure/table, -/obj/item/plant_analyzer, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) "krL" = ( /turf/open/floor/wood, /area/station/command/corporate_showroom) @@ -29061,6 +29075,10 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/gateway) +"ksN" = ( +/obj/structure/flora/bush/flowers_yw, +/turf/open/floor/grass, +/area/station/service/hydroponics/garden) "ksT" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -29344,6 +29362,16 @@ /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, /area/station/security/office) +"kxD" = ( +/obj/effect/turf_decal/siding/white{ + dir = 10 + }, +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/sign/clock/directional/south, +/turf/open/water, +/area/station/service/hydroponics/garden) "kxH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -29855,6 +29883,15 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/engine, /area/station/science/explab) +"kIk" = ( +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/water, +/area/station/service/hydroponics/garden) "kIG" = ( /obj/structure/rack, /obj/effect/spawner/random/maintenance/two, @@ -30484,6 +30521,12 @@ /obj/machinery/shieldgen, /turf/open/floor/plating, /area/station/engineering/main) +"kTa" = ( +/obj/effect/turf_decal/siding/white{ + dir = 9 + }, +/turf/open/water, +/area/station/service/hydroponics/garden) "kTn" = ( /obj/machinery/firealarm/directional/south, /obj/effect/turf_decal/tile/neutral, @@ -30941,13 +30984,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/security/prison/visit) -"lbH" = ( -/mob/living/basic/chicken{ - name = "Featherbottom"; - real_name = "Featherbottom" - }, -/turf/open/floor/grass, -/area/station/service/hydroponics/garden) "lbL" = ( /obj/effect/decal/cleanable/insectguts, /obj/effect/turf_decal/siding/purple{ @@ -31007,18 +31043,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"ldg" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) "lds" = ( /obj/structure/table, /obj/item/storage/fancy/egg_box, @@ -32295,14 +32319,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/grimy, /area/station/security/detectives_office) -"lGI" = ( -/obj/structure/chair/office/light{ - dir = 8 - }, -/obj/effect/landmark/start/virologist, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/medical/virology) "lGL" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, @@ -32402,9 +32418,6 @@ /obj/structure/chair/comfy/brown, /turf/open/floor/engine/cult, /area/station/service/library) -"lJa" = ( -/turf/open/floor/grass, -/area/station/service/hydroponics/garden) "lJh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -33764,10 +33777,6 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/plating, /area/station/maintenance/department/engine) -"mie" = ( -/obj/structure/window/spawner/directional/south, -/turf/open/floor/grass, -/area/station/service/hydroponics/garden) "mig" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -34683,6 +34692,19 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron/dark/textured_large, /area/station/science/cytology) +"myA" = ( +/obj/structure/table, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/item/storage/bag/plants/portaseeder, +/obj/item/crowbar, +/obj/item/reagent_containers/cup/watering_can, +/obj/item/cultivator, +/obj/item/hatchet, +/obj/item/plant_analyzer, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) "myB" = ( /obj/structure/chair, /obj/structure/cable, @@ -40188,11 +40210,6 @@ }, /turf/open/floor/iron, /area/station/science/lab) -"otG" = ( -/obj/item/radio/intercom/directional/east, -/obj/structure/window/spawner/directional/north, -/turf/open/floor/grass, -/area/station/service/hydroponics/garden) "otI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -40655,15 +40672,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"oCO" = ( -/obj/structure/window/spawner/directional/west, -/obj/structure/window/spawner/directional/south, -/mob/living/basic/chicken{ - name = "Kentucky"; - real_name = "Kentucky" - }, -/turf/open/floor/grass, -/area/station/service/hydroponics/garden) "oCR" = ( /obj/structure/extinguisher_cabinet/directional/east, /obj/machinery/suit_storage_unit/security, @@ -41729,6 +41737,15 @@ /obj/machinery/telecomms/server/presets/science, /turf/open/floor/circuit/telecomms/mainframe, /area/station/tcommsat/server) +"oXH" = ( +/obj/effect/turf_decal/siding/white{ + dir = 6 + }, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/water, +/area/station/service/hydroponics/garden) "oXJ" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -43773,6 +43790,24 @@ /obj/effect/mapping_helpers/airlock/access/any/command/eva, /turf/open/floor/iron, /area/station/ai_monitored/command/storage/eva) +"pIo" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wideplating_new{ + dir = 4 + }, +/obj/item/storage/toolbox/fishing, +/obj/item/storage/toolbox/fishing, +/obj/item/fishing_rod, +/obj/item/fishing_rod, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) "pIs" = ( /obj/item/radio/intercom/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -44339,19 +44374,6 @@ /obj/item/reagent_containers/spray/pepper, /turf/open/floor/iron, /area/station/security/execution/transfer) -"pRM" = ( -/obj/machinery/disposal/bin, -/obj/machinery/camera/directional/east{ - c_tag = "Garden" - }, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) "pSa" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 1 @@ -44542,6 +44564,14 @@ }, /turf/open/floor/iron, /area/station/cargo/miningoffice) +"pVW" = ( +/mob/living/basic/chicken{ + name = "Featherbottom"; + real_name = "Featherbottom" + }, +/obj/structure/flora/bush/fullgrass, +/turf/open/floor/grass, +/area/station/service/hydroponics/garden) "pVZ" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -48153,6 +48183,15 @@ /obj/machinery/recharge_station, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"rkf" = ( +/obj/effect/turf_decal/siding/wideplating_new{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) "rkg" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -52055,6 +52094,16 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"sEn" = ( +/obj/structure/cable, +/obj/structure/chair/office/light, +/obj/effect/landmark/start/virologist, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/virology) "sEv" = ( /obj/machinery/airalarm/directional/east, /obj/effect/turf_decal/trimline/blue/filled/corner{ @@ -55901,6 +55950,17 @@ /obj/structure/table/wood, /turf/open/floor/carpet, /area/station/service/chapel/funeral) +"tVC" = ( +/obj/machinery/power/smes/super/full, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/flasher/directional/north{ + id = "AI"; + pixel_x = -22 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) "tVG" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible, /obj/machinery/firealarm/directional/north, @@ -59987,6 +60047,14 @@ }, /turf/open/floor/iron/white/corner, /area/station/hallway/secondary/entry) +"vpO" = ( +/obj/structure/window/spawner/directional/south, +/mob/living/basic/cow{ + name = "Betsy"; + real_name = "Betsy" + }, +/turf/open/floor/grass, +/area/station/service/hydroponics/garden) "vpP" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -62269,6 +62337,18 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, /area/station/medical/storage) +"wbh" = ( +/obj/structure/table/glass, +/obj/machinery/reagentgrinder{ + pixel_y = 8 + }, +/obj/item/toy/figure/virologist{ + pixel_x = -8 + }, +/obj/effect/turf_decal/tile/green/half/contrasted, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/virology) "wbv" = ( /obj/structure/sign/warning/vacuum/external/directional/north, /obj/effect/turf_decal/stripes/line{ @@ -64466,10 +64546,6 @@ /obj/structure/table, /turf/open/floor/iron/white, /area/station/science/robotics/lab) -"wRF" = ( -/obj/structure/window/spawner/directional/west, -/turf/open/floor/grass, -/area/station/service/hydroponics/garden) "wRL" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -66286,12 +66362,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/chemistry) -"xyI" = ( -/obj/machinery/door/window/left/directional/west{ - name = "Animal Pen B" - }, -/turf/open/floor/grass, -/area/station/service/hydroponics/garden) "xyM" = ( /obj/structure/cable, /turf/open/floor/plating, @@ -66459,17 +66529,6 @@ }, /turf/open/floor/iron, /area/station/ai_monitored/command/storage/eva) -"xBR" = ( -/obj/machinery/power/smes/super/full, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/flasher/directional/north{ - id = "AI"; - pixel_x = -22 - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) "xBX" = ( /obj/machinery/firealarm/directional/east, /turf/closed/wall, @@ -67395,17 +67454,6 @@ }, /turf/closed/wall/r_wall, /area/station/hallway/primary/fore) -"xUE" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) "xUH" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -82741,8 +82789,8 @@ xjH pIU dno uKy -lGI -dkj +hDr +wbh xjH nzQ vol @@ -83519,7 +83567,7 @@ pWX eYE hcR gqV -aeA +sEn vUH rUE suP @@ -104780,7 +104828,7 @@ jBY aKk lXl nzS -gpk +myA qXB kbo tbd @@ -105548,10 +105596,10 @@ lqQ fzr iCJ qgy -ldg -ivb -bYN -krt +fPj +rkf +rkf +pIo qXB psZ qXB @@ -105802,13 +105850,13 @@ lnc fDC qdy lqQ -wRF +iLj jzC -oCO -xUE -jGE -xyI -wRF +gqw +jbN +kTa +hlG +kxD qXB kbo qXB @@ -106059,13 +106107,13 @@ lnc cUP mil lqQ -lbH -lJa -mie -pRM -otG -jYu -lJa +pVW +ksN +vpO +fdi +eiZ +kIk +oXH qXB psZ qXB @@ -123284,7 +123332,7 @@ qyc jZC pan mbS -xBR +tVC mCL aWO aYz diff --git a/_maps/map_files/NorthStar/north_star.dmm b/_maps/map_files/NorthStar/north_star.dmm index dde4d751e1f..95f74e18ba9 100644 --- a/_maps/map_files/NorthStar/north_star.dmm +++ b/_maps/map_files/NorthStar/north_star.dmm @@ -3381,16 +3381,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/floor3/aft) -"aSz" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 1; - id = "cmoshutter"; - name = "CMO Privacy Shutters" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/command/heads_quarters/cmo) "aSB" = ( /obj/effect/spawner/random/trash/cigbutt, /turf/open/floor/iron/dark, @@ -8551,6 +8541,16 @@ /mob/living/basic/rabbit, /turf/open/floor/grass, /area/station/hallway/secondary/entry) +"ceF" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "CMO Privacy Shutters"; + dir = 4; + id = "cmoshutter" + }, +/turf/open/floor/plating, +/area/station/medical/storage) "ceH" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/green/line{ @@ -11197,31 +11197,6 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/bronze/filled, /area/station/maintenance/floor1/starboard) -"cNC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/button/door/directional/west{ - id = "viro-inner"; - name = "Inner Virology Lockdown"; - pixel_y = -8 - }, -/obj/machinery/button/door/directional/west{ - id = "viro-outer"; - name = "Outer Virology Lockdown"; - pixel_y = 8 - }, -/obj/machinery/button/door/directional/west{ - id = "viro-iso"; - name = "Isolation Bolts"; - normaldoorcontrol = 1; - pixel_x = -36; - specialfunctions = 4 - }, -/obj/effect/turf_decal/tile/green/opposingcorners, -/obj/effect/landmark/start/virologist, -/turf/open/floor/iron/white, -/area/station/medical/virology) "cNE" = ( /obj/structure/mineral_door/paperframe, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -14128,16 +14103,6 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron/dark/side, /area/station/hallway/floor4/aft) -"dCm" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 8; - id = "cmoshutter"; - name = "CMO Privacy Shutters" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/command/heads_quarters/cmo) "dCt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -26969,6 +26934,16 @@ /obj/effect/landmark/start/atmospheric_technician, /turf/open/floor/iron, /area/station/engineering/atmos) +"hab" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 1; + id = "cmoshutter"; + name = "CMO Privacy Shutters" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/command/heads_quarters/cmo) "hah" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white/smooth_corner{ @@ -29826,16 +29801,6 @@ dir = 8 }, /area/station/commons/dorms/room1) -"hLa" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 1; - id = "cmoshutter"; - name = "CMO Privacy Shutters" - }, -/turf/open/floor/plating, -/area/station/command/heads_quarters/cmo) "hLd" = ( /obj/machinery/door/firedoor/border_only{ dir = 1 @@ -41362,19 +41327,6 @@ /obj/effect/turf_decal/trimline/dark_blue/end, /turf/open/floor/iron/dark, /area/station/commons/storage/tools) -"kIx" = ( -/obj/machinery/keycard_auth/directional/north{ - pixel_x = 9 - }, -/obj/machinery/button/door/directional/north{ - name = "CMO Privacy Shutters"; - id = "cmoshutter"; - req_access = list("cmo"); - pixel_y = 25; - pixel_x = -5 - }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/cmo) "kIG" = ( /obj/machinery/button/door/directional/north{ id = "Secure Storage"; @@ -41750,6 +41702,11 @@ /obj/machinery/duct, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"kNy" = ( +/obj/item/storage/toolbox/maint_kit, +/obj/effect/spawner/random/junk_shell, +/turf/open/floor/pod/light, +/area/station/maintenance/floor4/port) "kNA" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -42618,16 +42575,6 @@ /obj/structure/rack, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/fore) -"kYr" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 8; - id = "cmoshutter"; - name = "CMO Privacy Shutters" - }, -/turf/open/floor/plating, -/area/station/command/heads_quarters/cmo) "kYt" = ( /obj/structure/chair/comfy/carp, /turf/open/floor/carpet/neon/simple/pink/nodots, @@ -46303,6 +46250,16 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/port) +"lTO" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 1; + id = "cmoshutter"; + name = "CMO Privacy Shutters" + }, +/turf/open/floor/plating, +/area/station/command/heads_quarters/cmo) "lTV" = ( /obj/machinery/door/firedoor, /obj/machinery/mineral/ore_redemption, @@ -51277,6 +51234,16 @@ /obj/structure/cable/layer3, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat) +"nge" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8; + id = "cmoshutter"; + name = "CMO Privacy Shutters" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/command/heads_quarters/cmo) "ngf" = ( /obj/structure/railing, /obj/effect/decal/cleanable/dirt, @@ -57427,6 +57394,16 @@ /obj/structure/sign/poster/official/terragov/directional/north, /turf/open/floor/iron/dark/small, /area/station/science/xenobiology) +"oJs" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 8; + id = "cmoshutter"; + name = "CMO Privacy Shutters" + }, +/turf/open/floor/plating, +/area/station/command/heads_quarters/cmo) "oJO" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/pod/dark, @@ -59400,14 +59377,6 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/port/aft) -"pmI" = ( -/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/green/opposingcorners, -/obj/effect/landmark/start/virologist, -/turf/open/floor/iron/white, -/area/station/medical/virology) "pmO" = ( /obj/structure/chair/comfy/brown{ dir = 8 @@ -68112,11 +68081,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor1/starboard/fore) -"rxZ" = ( -/obj/item/storage/toolbox/maint_kit, -/obj/item/ammo_casing/shotgun/improvised, -/turf/open/floor/pod/light, -/area/station/maintenance/floor4/port) "ryh" = ( /obj/structure/cable/multilayer/multiz, /turf/open/floor/plating/airless, @@ -87843,16 +87807,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/carpet/red, /area/station/service/theater) -"wBe" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/obj/machinery/door/poddoor/shutters/preopen{ - name = "CMO Privacy Shutters"; - dir = 4; - id = "cmoshutter" - }, -/turf/open/floor/plating, -/area/station/medical/storage) "wBg" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/robot_debris/up, @@ -92040,6 +91994,19 @@ /obj/effect/turf_decal/siding/thinplating_new/corner, /turf/open/floor/iron/smooth, /area/station/cargo/sorting) +"xEv" = ( +/obj/machinery/keycard_auth/directional/north{ + pixel_x = 9 + }, +/obj/machinery/button/door/directional/north{ + name = "CMO Privacy Shutters"; + id = "cmoshutter"; + req_access = list("cmo"); + pixel_y = 25; + pixel_x = -5 + }, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/cmo) "xEw" = ( /obj/machinery/computer/camera_advanced/base_construction/aux{ dir = 4 @@ -93018,6 +92985,14 @@ dir = 1 }, /area/station/science/genetics) +"xRI" = ( +/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/green/opposingcorners, +/obj/effect/landmark/start/virologist, +/turf/open/floor/iron/white, +/area/station/medical/virology) "xRJ" = ( /obj/effect/decal/cleanable/blood/old, /obj/item/screwdriver, @@ -94318,6 +94293,31 @@ /obj/item/reagent_containers/pill/maintenance, /turf/open/floor/iron/white, /area/station/medical/abandoned) +"yks" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/button/door/directional/west{ + id = "viro-inner"; + name = "Inner Virology Lockdown"; + pixel_y = -8 + }, +/obj/machinery/button/door/directional/west{ + id = "viro-outer"; + name = "Outer Virology Lockdown"; + pixel_y = 8 + }, +/obj/machinery/button/door/directional/west{ + id = "viro-iso"; + name = "Isolation Bolts"; + normaldoorcontrol = 1; + pixel_x = -36; + specialfunctions = 4 + }, +/obj/effect/turf_decal/tile/green/opposingcorners, +/obj/effect/landmark/start/virologist, +/turf/open/floor/iron/white, +/area/station/medical/virology) "ykt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -190467,9 +190467,9 @@ syV wPX xKq nCG -dCm +nge goX -kYr +oJs nCG mrG mrG @@ -190723,7 +190723,7 @@ jRO ihm wyE xKq -hLa +lTO rac srK keJ @@ -190980,7 +190980,7 @@ jRO eCO wyE xKq -aSz +hab dZz bPP xhJ @@ -191752,7 +191752,7 @@ tam oKR xKq nCG -kIx +xEv rBt aDp xug @@ -192267,10 +192267,10 @@ eBo vOn nfv nfv -wBe -wBe -wBe -wBe +ceF +ceF +ceF +ceF nfv nfv mHh @@ -195582,7 +195582,7 @@ mqc mRQ dVV xNy -cNC +yks mcI rPC sJn @@ -196096,7 +196096,7 @@ iOA utl doh gJz -pmI +xRI hwQ piz aWO @@ -196610,7 +196610,7 @@ iOA dfU pZm wJy -pmI +xRI dVV bLm yhv @@ -314350,7 +314350,7 @@ cis cub wTg vEa -rxZ +kNy tCG pme iho diff --git a/_maps/map_files/generic/CentCom_skyrat_z2.dmm b/_maps/map_files/generic/CentCom_skyrat_z2.dmm index 8174c40573b..80608e8af0e 100644 --- a/_maps/map_files/generic/CentCom_skyrat_z2.dmm +++ b/_maps/map_files/generic/CentCom_skyrat_z2.dmm @@ -82,7 +82,10 @@ /area/centcom/holding/cafe) "adU" = ( /obj/effect/turf_decal/delivery, -/obj/structure/closet/crate/bin, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, /turf/open/floor/iron, /area/centcom/interlink) "aek" = ( @@ -210,6 +213,13 @@ /obj/structure/destructible/cult/item_dispenser/archives, /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) +"afJ" = ( +/obj/item/kirbyplants/random, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/centcom/interlink) "afK" = ( /obj/effect/turf_decal/loading_area{ dir = 8 @@ -341,6 +351,7 @@ /obj/item/tank/internals/plasmaman/belt/full, /obj/item/tank/internals/plasmaman/belt/full, /obj/item/tank/internals/plasmaman/belt/full, +/obj/structure/disposalpipe/segment, /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) "ahI" = ( @@ -734,6 +745,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/indestructible/hoteltile{ icon_state = "floor" }, @@ -957,7 +971,11 @@ /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 6 }, -/obj/structure/closet/crate/bin, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, /turf/open/indestructible/hoteltile{ icon_state = "floor" }, @@ -1135,7 +1153,6 @@ /turf/open/misc/grass/planet, /area/centcom/holding/cafe/park) "aqX" = ( -/obj/structure/closet/crate/bin, /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -1150,6 +1167,10 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, /turf/open/indestructible/hoteltile{ icon_state = "floor" }, @@ -1686,6 +1707,15 @@ dir = 4 }, /area/centcom/holding/cafe/park) +"ayb" = ( +/obj/effect/turf_decal/trimline/dark_green/filled/warning{ + dir = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/centcom/interlink) "ayd" = ( /obj/structure/flora/grass/green{ icon_state = "snowgrass3gb" @@ -1722,6 +1752,9 @@ }, /obj/effect/turf_decal/trimline/blue/filled/line, /obj/machinery/light/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/indestructible/hoteltile{ icon_state = "floor" }, @@ -2285,6 +2318,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/structure/disposalpipe/segment, /turf/open/indestructible/hoteltile{ icon_state = "floor" }, @@ -2529,6 +2563,7 @@ /obj/effect/spawner/random/bedsheet/double, /obj/effect/spawner/random/bedsheet/double, /obj/effect/spawner/random/bedsheet/double, +/obj/structure/disposalpipe/segment, /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) "aHb" = ( @@ -3216,6 +3251,7 @@ "aOV" = ( /obj/item/book/manual/wiki/barman_recipes, /obj/structure/table/wood, +/obj/structure/disposalpipe/segment, /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) "aOW" = ( @@ -3910,6 +3946,7 @@ /obj/item/clothing/mask/breath/vox, /obj/item/clothing/mask/breath/vox, /obj/item/clothing/mask/breath/vox, +/obj/structure/disposalpipe/segment, /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) "aWi" = ( @@ -3949,6 +3986,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/structure/disposalpipe/segment, /turf/open/indestructible/hoteltile{ icon_state = "floor" }, @@ -4222,6 +4260,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, /turf/open/indestructible/hoteltile{ icon_state = "floor" }, @@ -4294,6 +4335,13 @@ }, /turf/open/floor/iron/smooth_large, /area/cruiser_dock) +"bhN" = ( +/obj/effect/turf_decal/tile/blue, +/obj/structure/disposalpipe/segment, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafe) "bhQ" = ( /obj/structure/mineral_door/paperframe{ name = "Shinto Cabin Bedroom" @@ -4375,6 +4423,9 @@ dir = 1 }, /obj/effect/landmark/latejoin, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/iron, /area/centcom/interlink) "blD" = ( @@ -4427,6 +4478,7 @@ /obj/effect/turf_decal/trimline/dark_green/filled/warning{ dir = 6 }, +/obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/centcom/interlink) "bqc" = ( @@ -4640,6 +4692,12 @@ /obj/machinery/time_clock/directional/west, /turf/open/floor/iron/white, /area/centcom/interlink) +"bGk" = ( +/obj/structure/disposalpipe/junction/flip{ + dir = 1 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "bGx" = ( /obj/item/clothing/suit/costume/xenos, /obj/item/clothing/head/costume/xenos, @@ -4750,6 +4808,30 @@ }, /turf/open/floor/iron/dark, /area/centcom/interlink) +"bOv" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/disposaloutlet{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/plating, +/area/centcom/interlink) +"bOD" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafe/park) "bON" = ( /obj/structure/chair/sofa/bench/corner{ dir = 1 @@ -4917,6 +4999,14 @@ /obj/structure/table/wood, /turf/open/floor/wood, /area/centcom/holding/cafe) +"bYh" = ( +/obj/machinery/conveyor_switch/oneway{ + dir = 8; + id = "cafesposals"; + name = "disposal conveyor" + }, +/turf/open/indestructible/plating, +/area/centcom/holding/cafe) "bYx" = ( /obj/effect/turf_decal/siding/wood{ dir = 6 @@ -4935,6 +5025,12 @@ /obj/structure/chair/sofa/corp/corner, /turf/open/indestructible/carpet, /area/centcom/holding/cafe) +"bZy" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating, +/area/centcom/interlink) "cal" = ( /obj/structure/railing{ dir = 1 @@ -4954,6 +5050,11 @@ /obj/structure/railing/wooden_fencing, /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe/park) +"cbl" = ( +/obj/machinery/light/directional/east, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/centcom/interlink) "cby" = ( /obj/structure/railing{ invisibility = 100; @@ -4995,6 +5096,13 @@ "cfu" = ( /turf/open/floor/grass, /area/centcom/interlink) +"cfG" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "cafesposals" + }, +/turf/open/indestructible/plating, +/area/centcom/holding/cafe) "cgU" = ( /obj/effect/light_emitter/interlink, /turf/open/misc/grass/planet, @@ -5117,6 +5225,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/indestructible/hoteltile{ icon_state = "floor" }, @@ -5592,6 +5703,10 @@ /obj/effect/light_emitter/interlink, /turf/open/floor/grass, /area/centcom/interlink) +"dfW" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/centcom/interlink) "dgl" = ( /obj/effect/spawner/liquids_spawner, /turf/open/floor/iron/stairs, @@ -5677,6 +5792,14 @@ "doA" = ( /turf/open/floor/wood/large, /area/centcom/holding/cafe) +"dqh" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/disposal/bin, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "drE" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -6361,6 +6484,12 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron/dark, /area/centcom/interlink) +"eGQ" = ( +/obj/machinery/door/window/brigdoor/left/directional/north{ + name = "Danger: Conveyor Access" + }, +/turf/open/floor/plating, +/area/centcom/interlink) "eHo" = ( /obj/effect/turf_decal/siding/dark{ dir = 1 @@ -6405,6 +6534,12 @@ }, /turf/open/floor/iron/smooth, /area/centcom/interlink) +"eKW" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/centcom/interlink) "eLt" = ( /obj/machinery/door/airlock/medical/glass{ name = "Interlink Medbay" @@ -6612,6 +6747,13 @@ icon_state = "darkfull" }, /area/centcom/holding/cafe/park) +"fbS" = ( +/obj/machinery/door/airlock/hatch{ + name = "Disposals" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/centcom/interlink) "fcW" = ( /obj/effect/turf_decal/tile/dark_blue/opposingcorners, /obj/effect/turf_decal/siding/wood{ @@ -6632,6 +6774,12 @@ }, /turf/open/floor/carpet/red, /area/cruiser_dock) +"fdP" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "fdX" = ( /obj/effect/turf_decal/bot, /obj/structure/grandfatherclock{ @@ -6682,6 +6830,12 @@ /obj/structure/frame/computer, /turf/open/floor/plating, /area/centcom/interlink) +"fnX" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron, +/area/centcom/interlink) "fol" = ( /turf/open/floor/iron/stairs/medium{ dir = 8 @@ -6762,6 +6916,27 @@ }, /turf/open/floor/wood/tile, /area/centcom/interlink) +"fuR" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafe/park) "fvx" = ( /obj/effect/turf_decal/bot, /obj/structure/showcase/machinery/signal_decrypter, @@ -6791,6 +6966,13 @@ /obj/structure/water_source/puddle, /turf/open/misc/dirt/planet, /area/centcom/holding/cafe/park) +"fxA" = ( +/obj/effect/turf_decal/trimline/dark_green/filled/corner, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron, +/area/centcom/interlink) "fxE" = ( /obj/structure/chair/sofa/bench/right{ greyscale_colors = "#AA8A61" @@ -6817,6 +6999,12 @@ smoothing_flags = 0 }, /area/centcom/holding/cafe) +"fBP" = ( +/obj/structure/disposalpipe/junction{ + dir = 4 + }, +/turf/open/floor/iron, +/area/centcom/interlink) "fCt" = ( /obj/machinery/light/directional/west, /obj/effect/turf_decal/trimline/dark_green/line{ @@ -6905,6 +7093,15 @@ /obj/effect/light_emitter/interlink, /turf/open/floor/grass, /area/centcom/interlink) +"fIx" = ( +/obj/effect/turf_decal/trimline/dark_green/filled/warning{ + dir = 1 + }, +/obj/structure/disposalpipe/junction/yjunction{ + dir = 4 + }, +/turf/open/floor/iron, +/area/centcom/interlink) "fIS" = ( /obj/structure/flora/bush/fullgrass/style_random, /obj/structure/flora/bush/flowers_pp/style_random, @@ -7231,6 +7428,14 @@ }, /turf/open/floor/iron/white, /area/centcom/holding/cafe) +"gow" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/indestructible/plating, +/area/centcom/holding/cafe/park) "goK" = ( /obj/structure/railing{ invisibility = 100; @@ -7263,6 +7468,12 @@ }, /turf/open/indestructible/cobble, /area/centcom/holding/cafe/park) +"gqT" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plating, +/area/centcom/interlink) "grr" = ( /obj/structure/table, /obj/structure/towel_bin, @@ -7325,6 +7536,9 @@ /obj/effect/turf_decal/trimline/yellow/filled/warning{ dir = 1 }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/indestructible/plating, /area/centcom/holding/cafe/park) "gtZ" = ( @@ -7375,6 +7589,9 @@ /obj/effect/turf_decal/trimline/dark_green/filled/line{ dir = 1 }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/iron, /area/centcom/interlink) "gyS" = ( @@ -7419,6 +7636,12 @@ /obj/effect/turf_decal/siding/white, /turf/open/floor/iron/white, /area/centcom/interlink) +"gBT" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafe/park) "gCQ" = ( /obj/structure/chair/sofa/corp, /obj/effect/turf_decal/stripes/line, @@ -7435,6 +7658,16 @@ dir = 4 }, /area/cruiser_dock) +"gEz" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "interdisposals" + }, +/obj/machinery/recycler{ + dir = 8 + }, +/turf/open/floor/plating, +/area/centcom/interlink) "gFA" = ( /obj/effect/spawner/random/vending/colavend, /obj/effect/turf_decal/bot_white, @@ -7709,6 +7942,15 @@ }, /turf/open/floor/iron, /area/centcom/holding/cafe) +"hhj" = ( +/obj/effect/turf_decal/trimline/dark_green/filled/warning{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron, +/area/centcom/interlink) "hje" = ( /obj/structure/stone_tile/block{ dir = 4 @@ -7815,20 +8057,14 @@ /turf/open/floor/wood, /area/centcom/holding/cafe) "hpl" = ( -/obj/machinery/light/floor{ - alpha = 0; - invisibility = 100; - light_range = 10; - nightshift_light_power = 10 - }, -/obj/effect/turf_decal/weather/dirt{ +/obj/effect/turf_decal/trimline/dark_green/filled/line{ dir = 1 }, -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 1 +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/open/indestructible/plating, -/area/centcom/holding/cafe/park) +/turf/open/floor/iron, +/area/centcom/interlink) "hpP" = ( /mob/living/basic/butterfly, /turf/open/misc/grass/planet, @@ -7917,6 +8153,12 @@ }, /turf/open/floor/carpet/executive, /area/centcom/interlink) +"hzy" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/centcom/interlink) "hzz" = ( /obj/structure/chair/sofa/bench/right{ dir = 4 @@ -8163,6 +8405,25 @@ }, /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) +"hVr" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/structure/disposalpipe/junction{ + dir = 1 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafe) "hVC" = ( /obj/structure/dresser, /obj/machinery/light/warm/no_nightlight/directional/north, @@ -8228,6 +8489,17 @@ }, /turf/open/floor/fakebasalt, /area/centcom/holding/cafe/park) +"hYt" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/junction/yjunction{ + dir = 4 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafe) "hYA" = ( /turf/open/floor/iron/dark/corner{ dir = 8 @@ -8319,6 +8591,10 @@ }, /turf/open/floor/iron, /area/centcom/interlink) +"igB" = ( +/obj/structure/disposalpipe/segment, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "ihd" = ( /turf/open/floor/sepia, /area/centcom/holding/cafe) @@ -8431,6 +8707,9 @@ /obj/effect/turf_decal/trimline/dark_green/filled/warning{ dir = 1 }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/iron, /area/centcom/interlink) "iov" = ( @@ -8536,6 +8815,15 @@ /obj/effect/light_emitter/interlink, /turf/open/floor/carpet/red, /area/centcom/interlink) +"ivR" = ( +/obj/effect/turf_decal/trimline/dark_green/filled/corner{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/centcom/interlink) "iwF" = ( /obj/effect/turf_decal/sand, /obj/machinery/vending/cigarette/beach, @@ -8740,10 +9028,18 @@ }, /turf/open/floor/iron/dark, /area/centcom/interlink) +"iTl" = ( +/obj/machinery/light/directional/north, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/centcom/interlink) "iTA" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe/park) "iUc" = ( @@ -8821,6 +9117,27 @@ icon_state = "floor" }, /area/centcom/holding/cafe) +"iYh" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafe/park) "iYB" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -8838,6 +9155,18 @@ /obj/structure/closet/abductor, /turf/open/floor/plating/abductor, /area/centcom/holding/cafe/park) +"iYD" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafe) "iZc" = ( /obj/structure/table/reinforced/plastitaniumglass, /obj/item/storage/fancy/cigarettes/cigars/havana{ @@ -9049,11 +9378,14 @@ /area/centcom/interlink) "jsN" = ( /obj/machinery/light/directional/east, -/obj/structure/closet/crate/bin, /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/trimline/dark_green/filled/line{ dir = 4 }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, /turf/open/floor/iron, /area/centcom/interlink) "jsY" = ( @@ -9075,6 +9407,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/indestructible/hoteltile{ icon_state = "floor" }, @@ -9144,6 +9479,14 @@ /obj/machinery/light/warm/directional/west, /turf/open/floor/wood/tile, /area/centcom/interlink) +"jzj" = ( +/obj/machinery/door/airlock/multi_tile/public/glass{ + name = "Interlink" + }, +/obj/effect/turf_decal/siding/dark, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/centcom/interlink) "jzL" = ( /obj/structure/spacevine{ name = "thick vines"; @@ -9193,6 +9536,13 @@ /obj/item/pen, /turf/open/floor/iron/dark/textured_large, /area/centcom/interlink) +"jHi" = ( +/obj/effect/turf_decal/trimline/dark_green/filled/warning{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/centcom/interlink) "jHv" = ( /obj/structure/bookcase/random/reference, /turf/open/floor/wood, @@ -9224,6 +9574,16 @@ "jIj" = ( /turf/open/floor/wood, /area/centcom/holding/cafe/dorms) +"jJi" = ( +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/trimline/dark_green/filled/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron, +/area/centcom/interlink) "jKj" = ( /obj/structure/bed/pod, /turf/open/floor/iron, @@ -9284,21 +9644,14 @@ /turf/open/floor/grass, /area/centcom/interlink) "jTQ" = ( -/obj/structure/closet/crate/bin, -/obj/item/paper/pamphlet/centcom/visitor_info, -/obj/item/paper/pamphlet/centcom/visitor_info{ - pixel_x = -9 - }, -/obj/item/paper/pamphlet/centcom/visitor_info{ - pixel_x = -3 - }, -/obj/item/paper/pamphlet/centcom/visitor_info{ - pixel_x = 3 - }, /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/trimline/dark_green/filled/line{ dir = 6 }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, /turf/open/floor/iron, /area/centcom/interlink) "jUm" = ( @@ -9343,6 +9696,7 @@ /obj/effect/turf_decal/weather/dirt{ dir = 6 }, +/obj/structure/disposalpipe/segment, /turf/open/indestructible/plating, /area/centcom/holding/cafe/park) "jZb" = ( @@ -9468,6 +9822,11 @@ }, /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) +"klb" = ( +/obj/structure/fans/tiny/invisible, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/stairs, +/area/centcom/holding/cafe) "klI" = ( /obj/docking_port/stationary{ dir = 2; @@ -9778,6 +10137,14 @@ }, /turf/open/indestructible/plating, /area/centcom/holding/cafe/park) +"kLC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron, +/area/centcom/interlink) "kLD" = ( /obj/machinery/light/directional/south, /turf/open/indestructible/hotelwood, @@ -9822,6 +10189,12 @@ /obj/effect/mapping_helpers/airlock/access/all/service/kitchen, /turf/open/floor/iron/cafeteria, /area/centcom/interlink) +"kNU" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafe/park) "kOf" = ( /obj/item/food/grown/herbs, /obj/item/food/grown/herbs, @@ -10011,6 +10384,11 @@ "lcR" = ( /turf/closed/indestructible/riveted, /area/centcom/interlink/dorm_rooms) +"ldc" = ( +/obj/machinery/light/directional/west, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/centcom/interlink) "ldK" = ( /obj/structure/toilet{ pixel_y = 12 @@ -10133,6 +10511,13 @@ }, /turf/open/floor/iron, /area/centcom/interlink) +"liW" = ( +/obj/structure/fence{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafe/park) "ljS" = ( /obj/effect/turf_decal/siding/white{ dir = 4 @@ -10146,6 +10531,12 @@ /obj/structure/spacevine, /turf/open/water/beach, /area/centcom/holding/cafe/park) +"lkp" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron, +/area/centcom/interlink) "lkC" = ( /obj/structure/chair/sofa/bench/left{ dir = 1; @@ -10443,6 +10834,10 @@ }, /turf/open/floor/carpet/red, /area/centcom/holding/cafe/dorms) +"lQD" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/turf/open/floor/plating, +/area/centcom/interlink) "lRF" = ( /obj/structure/table/reinforced, /obj/machinery/door/window/brigdoor/left/directional/south{ @@ -10505,6 +10900,15 @@ }, /turf/open/floor/iron/smooth_large, /area/cruiser_dock) +"lTq" = ( +/obj/effect/turf_decal/trimline/dark_green/filled/warning{ + dir = 1 + }, +/obj/structure/disposalpipe/junction/yjunction{ + dir = 1 + }, +/turf/open/floor/iron, +/area/centcom/interlink) "lTP" = ( /obj/effect/light_emitter/interlink, /obj/structure/flora/tree/jungle/style_6, @@ -10611,6 +11015,13 @@ }, /turf/open/indestructible/plating, /area/centcom/holding/cafe/park) +"mfH" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/door/window/brigdoor/left/directional/north{ + name = "Danger: Conveyor Access" + }, +/turf/open/floor/plating, +/area/centcom/interlink) "mfN" = ( /obj/structure/table{ name = "Jim Norton's Quebecois Coffee table" @@ -10670,6 +11081,7 @@ /obj/effect/turf_decal/trimline/dark_green/filled/warning{ dir = 5 }, +/obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/centcom/interlink) "mmL" = ( @@ -10813,6 +11225,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, +/obj/structure/disposalpipe/segment, /turf/open/indestructible/hoteltile{ icon_state = "floor" }, @@ -10844,10 +11257,14 @@ /turf/open/floor/carpet/red, /area/cruiser_dock) "mza" = ( -/obj/structure/closet/crate/bin, /obj/effect/turf_decal/siding/wood{ dir = 4 }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/delivery, /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe/park) "mzf" = ( @@ -10993,6 +11410,24 @@ /obj/effect/turf_decal/stripes/asteroid/line, /turf/open/misc/beach/sand, /area/centcom/holding/cafe/park) +"mGi" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafe) "mGn" = ( /obj/structure/table{ name = "Jim Norton's Quebecois Coffee table" @@ -11044,6 +11479,34 @@ }, /turf/open/misc/beach/sand, /area/centcom/holding/cafe/park) +"mKm" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "cafesposals" + }, +/obj/machinery/recycler{ + dir = 8 + }, +/turf/open/indestructible/plating, +/area/centcom/holding/cafe) +"mKt" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafe) "mLa" = ( /obj/effect/light_emitter/interlink, /obj/effect/turf_decal/weather/dirt{ @@ -11092,6 +11555,9 @@ /obj/effect/turf_decal/trimline/yellow/filled/warning{ dir = 1 }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/indestructible/plating, /area/centcom/holding/cafe/park) "mQa" = ( @@ -11144,6 +11610,7 @@ /obj/effect/turf_decal/weather/dirt{ dir = 5 }, +/obj/structure/disposalpipe/segment, /turf/open/indestructible/plating, /area/centcom/holding/cafe/park) "mTS" = ( @@ -11258,6 +11725,15 @@ }, /turf/open/floor/iron, /area/centcom/holding/cafe) +"neS" = ( +/obj/effect/turf_decal/trimline/dark_green/filled/corner{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/centcom/interlink) "ngg" = ( /obj/structure/chair/stool/bar/directional/west, /turf/open/indestructible/hotelwood, @@ -11366,6 +11842,7 @@ "nmH" = ( /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, /area/centcom/interlink) "nng" = ( @@ -11494,6 +11971,14 @@ /obj/item/reagent_containers/cup/rag, /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) +"nua" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron, +/area/centcom/interlink) "nxR" = ( /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 1 @@ -11555,6 +12040,10 @@ }, /turf/open/floor/wood/tile, /area/centcom/interlink) +"nGq" = ( +/obj/structure/sign/poster/random/directional/west, +/turf/open/floor/plating, +/area/centcom/interlink) "nGL" = ( /obj/structure/table/wood, /obj/item/soap/deluxe, @@ -11597,8 +12086,19 @@ /obj/effect/turf_decal/arrows{ dir = 8 }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/iron/dark, /area/centcom/interlink) +"nKi" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/machinery/conveyor_switch/oneway{ + id = "interdisposals"; + name = "disposals conveyor switch" + }, +/turf/open/floor/plating, +/area/centcom/interlink) "nKt" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/chair/sofa/middle/brown, @@ -11709,6 +12209,10 @@ }, /turf/open/floor/wood/parquet, /area/centcom/interlink) +"nRe" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/centcom/interlink) "nRP" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -11765,6 +12269,9 @@ /obj/effect/turf_decal/trimline/yellow/filled/warning{ dir = 1 }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/indestructible/plating, /area/centcom/holding/cafe/park) "nYp" = ( @@ -11779,6 +12286,9 @@ dir = 9 }, /obj/effect/landmark/latejoin, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, /turf/open/floor/iron, /area/centcom/interlink) "nYF" = ( @@ -11881,6 +12391,9 @@ dir = 4 }, /obj/effect/turf_decal/arrows, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, /turf/open/floor/iron, /area/centcom/interlink) "oln" = ( @@ -11990,6 +12503,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/centcom/interlink/dorm_rooms) +"otM" = ( +/obj/structure/disposalpipe/junction/flip{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/centcom/interlink) "ouF" = ( /obj/item/toy/plush/moth{ name = "Buzz Buzz" @@ -12171,6 +12690,13 @@ }, /turf/open/floor/iron, /area/centcom/holding/cafe) +"oCu" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/centcom/interlink) "oCU" = ( /obj/effect/turf_decal/weather/dirt{ dir = 1 @@ -12220,6 +12746,9 @@ }, /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/centcom/interlink) "oIK" = ( @@ -12248,6 +12777,13 @@ /obj/effect/turf_decal/bot_blue, /turf/open/floor/iron/freezer, /area/centcom/interlink) +"oKf" = ( +/obj/effect/turf_decal/trimline/dark_green/filled/line, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron, +/area/centcom/interlink) "oKM" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -12807,6 +13343,14 @@ /obj/effect/mapping_helpers/airlock/access/all/service/kitchen, /turf/open/floor/iron/freezer, /area/centcom/interlink) +"pFf" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/centcom/interlink) "pFr" = ( /obj/effect/mapping_helpers/airlock/access/all/security/general, /obj/machinery/door/airlock/security{ @@ -12830,6 +13374,15 @@ }, /turf/open/floor/grass, /area/centcom/interlink) +"pGj" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron, +/area/centcom/interlink) "pGK" = ( /turf/open/floor/iron/dark/side, /area/centcom/holding/cafe) @@ -13090,6 +13643,12 @@ /obj/effect/turf_decal/bot, /turf/open/floor/wood, /area/centcom/interlink) +"pVr" = ( +/obj/effect/turf_decal/loading_area{ + dir = 1 + }, +/turf/open/floor/plating, +/area/centcom/interlink) "pWk" = ( /obj/machinery/door/airlock{ id_tag = "room6"; @@ -13151,6 +13710,10 @@ }, /turf/open/misc/beach/sand, /area/centcom/holding/cafe/park) +"qaM" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/centcom/interlink) "qaO" = ( /obj/structure/table/wood, /obj/machinery/chem_dispenser/drinks/fullupgrade{ @@ -13364,6 +13927,13 @@ }, /turf/open/floor/wood, /area/centcom/holding/cafe) +"qpp" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "interdisposals" + }, +/turf/open/floor/plating, +/area/centcom/interlink) "qpu" = ( /obj/effect/turf_decal/sand, /obj/structure/closet/crate/bin, @@ -13465,6 +14035,9 @@ /obj/effect/turf_decal/weather/dirt{ dir = 5 }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/indestructible/plating, /area/centcom/holding/cafe/park) "qzE" = ( @@ -13483,6 +14056,13 @@ }, /turf/open/misc/grass/planet, /area/centcom/holding/cafe/park) +"qAk" = ( +/obj/structure/disposaloutlet{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk, +/turf/open/indestructible/plating, +/area/centcom/holding/cafe) "qAW" = ( /obj/effect/turf_decal/siding/white{ dir = 4 @@ -13663,6 +14243,25 @@ /obj/effect/turf_decal/tile/red/opposingcorners, /turf/open/floor/iron/dark, /area/centcom/interlink) +"qQp" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafe) "qRd" = ( /obj/machinery/light/small/directional/north, /turf/open/floor/iron/showroomfloor, @@ -13776,6 +14375,11 @@ }, /turf/open/floor/grass, /area/centcom/interlink) +"raA" = ( +/obj/effect/turf_decal/trimline/dark_green/filled/corner, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/centcom/interlink) "raS" = ( /obj/structure/closet/crate/cardboard/mothic, /obj/item/storage/box/mothic_rations, @@ -13809,6 +14413,9 @@ /obj/structure/reagent_dispensers/fueltank/large, /turf/open/misc/dirt/planet, /area/centcom/holding/cafe/park) +"rfP" = ( +/turf/open/indestructible/plating, +/area/centcom/holding/cafe) "rgK" = ( /obj/docking_port/stationary{ dir = 8; @@ -13891,6 +14498,13 @@ icon_state = "floor" }, /area/centcom/holding/cafe/park) +"rkX" = ( +/obj/effect/turf_decal/trimline/dark_green/filled/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/centcom/interlink) "rma" = ( /obj/structure/railing/corner{ dir = 1 @@ -13963,6 +14577,24 @@ /obj/structure/wall_torch/spawns_lit/directional/south, /turf/open/misc/asteroid/snow/indestructible/planet, /area/centcom/holding/cafe/park) +"rnV" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafe/park) "roh" = ( /obj/structure/flora/grass/jungle/a/style_3, /obj/structure/flora/tree/jungle/small/style_random, @@ -14055,6 +14687,10 @@ }, /turf/open/floor/iron, /area/centcom/interlink) +"rEG" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/indestructible/wood, +/area/centcom/holding/cafe) "rFa" = ( /obj/effect/turf_decal/siding/white/corner{ dir = 8 @@ -14123,6 +14759,11 @@ /obj/machinery/door/window/left/directional/south, /turf/open/floor/iron/dark/textured_large, /area/centcom/interlink) +"rLG" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/centcom/interlink) "rMn" = ( /obj/structure/deployable_barricade/guardrail{ dir = 8 @@ -14211,6 +14852,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, +/obj/structure/disposalpipe/junction/flip{ + dir = 1 + }, /turf/open/indestructible/hoteltile{ icon_state = "floor" }, @@ -14454,6 +15098,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, +/obj/structure/disposalpipe/segment, /turf/open/indestructible/hoteltile{ icon_state = "floor" }, @@ -14498,6 +15143,20 @@ /obj/effect/turf_decal/trimline/dark_green/filled/line, /turf/open/floor/iron, /area/centcom/interlink) +"siN" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafe) "sjP" = ( /obj/structure/chair/sofa/bench/left{ dir = 8 @@ -14672,11 +15331,14 @@ /turf/open/floor/iron/white, /area/centcom/interlink) "sxE" = ( -/obj/structure/closet/crate/bin, /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/trimline/dark_green/filled/line{ dir = 8 }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, /turf/open/floor/iron, /area/centcom/interlink) "syc" = ( @@ -14704,6 +15366,9 @@ name = "Lounge" }, /obj/structure/fans/tiny/invisible, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/indestructible/hoteltile{ icon_state = "darkfull" }, @@ -14749,6 +15414,12 @@ dir = 8 }, /area/centcom/holding/cafe/park) +"sEi" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/iron/dark, +/area/centcom/interlink) "sFB" = ( /obj/machinery/vending/boozeomat/cafe, /turf/open/indestructible/hotelwood, @@ -15016,6 +15687,22 @@ /obj/item/reagent_containers/cup/glass/bottle/juice/cream, /turf/open/floor/iron, /area/centcom/interlink) +"sWg" = ( +/obj/effect/turf_decal/box, +/obj/effect/turf_decal/caution/stand_clear, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/wood/glass{ + desc = "A strange small bar. It's actually remarkably close to Space Station 13."; + name = "The Snoozy Floofer" + }, +/obj/structure/fans/tiny/invisible, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "darkfull" + }, +/area/centcom/holding/cafe) "sXR" = ( /turf/open/floor/stone, /area/centcom/holding/cafe) @@ -15104,7 +15791,7 @@ /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) "tct" = ( -/obj/structure/closet/crate/bin, +/obj/machinery/disposal/bin, /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/trimline/blue/filled/line, /obj/effect/turf_decal/tile/neutral{ @@ -15117,6 +15804,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, /turf/open/indestructible/hoteltile{ icon_state = "floor" }, @@ -15144,6 +15834,10 @@ }, /turf/open/floor/plating, /area/centcom/interlink) +"tez" = ( +/obj/structure/disposalpipe/segment, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafe/park) "tfe" = ( /obj/structure/window/reinforced/tinted/spawner/directional/west, /obj/machinery/shower/directional/south, @@ -15310,6 +16004,27 @@ /obj/machinery/vending/cola, /turf/open/misc/beach/sand, /area/centcom/holding/cafe/park) +"tzr" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafe) "tzz" = ( /obj/structure/toilet/snappop{ dir = 4 @@ -15489,6 +16204,7 @@ /obj/effect/turf_decal/trimline/dark_green/filled/line{ dir = 4 }, +/obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/centcom/interlink) "tXa" = ( @@ -15617,6 +16333,24 @@ }, /turf/open/floor/iron, /area/centcom/interlink) +"ucc" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafe/park) "ucr" = ( /obj/structure/chair/office, /obj/machinery/button/door/directional/east{ @@ -15713,6 +16447,21 @@ }, /turf/open/floor/iron/dark/textured_large, /area/centcom/interlink) +"uhT" = ( +/obj/machinery/mass_driver/trash{ + id = "interlinkdriver"; + dir = 1 + }, +/turf/open/floor/plating, +/area/centcom/interlink) +"uii" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/iron/dark, +/area/centcom/interlink) "uis" = ( /obj/structure/reagent_dispensers/plumbed, /turf/open/floor/iron/dark, @@ -15769,6 +16518,9 @@ /obj/effect/turf_decal/trimline/dark_green/filled/line{ dir = 1 }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/iron, /area/centcom/interlink) "umm" = ( @@ -15779,6 +16531,13 @@ }, /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) +"unr" = ( +/obj/machinery/door/poddoor/shutters/window/preopen, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/centcom/interlink) "unt" = ( /obj/structure/flora/rock/pile/style_random, /turf/open/misc/dirt/planet, @@ -16151,6 +16910,12 @@ }, /turf/open/floor/wood, /area/centcom/holding/cafe) +"uZQ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "vat" = ( /obj/effect/light_emitter/interlink, /turf/open/floor/grass, @@ -16234,6 +16999,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, +/obj/structure/disposalpipe/segment, /turf/open/indestructible/hoteltile{ icon_state = "floor" }, @@ -16250,6 +17016,26 @@ }, /turf/open/floor/bamboo, /area/centcom/holding/cafe) +"vlI" = ( +/obj/structure/railing/corner, +/obj/effect/turf_decal/trimline/blue/filled/corner, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/junction/flip{ + dir = 4 + }, +/turf/open/indestructible/hoteltile{ + icon_state = "floor" + }, +/area/centcom/holding/cafe/park) "vpT" = ( /obj/structure/table/reinforced, /obj/machinery/chem_dispenser/drinks/beer, @@ -16393,6 +17179,9 @@ /obj/effect/turf_decal/trimline/dark_green/filled/line{ dir = 1 }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/iron, /area/centcom/interlink) "vDr" = ( @@ -16450,6 +17239,12 @@ /obj/item/soap, /turf/open/floor/iron/freezer, /area/centcom/holding/cafe) +"vKa" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/misc/dirt/planet, +/area/centcom/holding/cafe/park) "vLh" = ( /obj/effect/turf_decal/trimline/green/filled/arrow_cw{ dir = 8 @@ -16524,6 +17319,15 @@ }, /turf/open/floor/iron/dark, /area/centcom/interlink) +"vRs" = ( +/obj/effect/turf_decal/trimline/dark_green/filled/corner{ + dir = 4 + }, +/obj/structure/disposalpipe/junction/yjunction{ + dir = 1 + }, +/turf/open/floor/iron, +/area/centcom/interlink) "vRE" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -16533,6 +17337,12 @@ "vTT" = ( /turf/closed/indestructible/steel, /area/centcom/holding/cafe) +"vUg" = ( +/obj/structure/disposalpipe/junction{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/centcom/interlink) "vUu" = ( /obj/structure/chair/sofa/left/brown, /turf/open/indestructible/hotelwood, @@ -16690,6 +17500,9 @@ /area/centcom/holding/cafe) "wfh" = ( /obj/effect/landmark/latejoin, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/iron, /area/centcom/interlink) "wft" = ( @@ -16810,6 +17623,12 @@ /obj/structure/shipping_container/cybersun, /turf/open/floor/iron/dark/textured_large, /area/cruiser_dock) +"wqV" = ( +/obj/machinery/door/airlock/wood{ + name = "Disposals" + }, +/turf/open/indestructible/plating, +/area/centcom/holding/cafe) "wrf" = ( /turf/open/floor/carpet/blue, /area/centcom/holding/cafe/dorms) @@ -16953,11 +17772,14 @@ /area/centcom/holding/cafe/park) "wFF" = ( /obj/machinery/light/directional/west, -/obj/structure/closet/crate/bin, /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/trimline/dark_green/filled/line{ dir = 8 }, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/disposal/bin, /turf/open/floor/iron, /area/centcom/interlink) "wGV" = ( @@ -17101,6 +17923,15 @@ /obj/machinery/light/cold/directional/east, /turf/open/floor/iron/dark/textured_large, /area/cruiser_dock) +"wUm" = ( +/obj/effect/turf_decal/trimline/dark_green/filled/warning{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/centcom/interlink) "wUt" = ( /obj/structure/table/wood, /obj/structure/towel_bin, @@ -17276,6 +18107,19 @@ /obj/machinery/duct, /turf/open/floor/wood/tile, /area/centcom/interlink) +"xgK" = ( +/obj/effect/turf_decal/box, +/obj/effect/turf_decal/caution/stand_clear, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/wood/glass{ + name = "Lounge" + }, +/obj/structure/fans/tiny/invisible, +/obj/structure/disposalpipe/segment, +/turf/open/indestructible/hoteltile{ + icon_state = "darkfull" + }, +/area/centcom/holding/cafe) "xkO" = ( /obj/structure/railing{ dir = 4 @@ -17368,6 +18212,15 @@ /obj/structure/sign/poster/contraband/red_rum/directional/north, /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) +"xpU" = ( +/obj/effect/turf_decal/trimline/dark_green/filled/line{ + dir = 1 + }, +/obj/structure/disposalpipe/junction/flip{ + dir = 8 + }, +/turf/open/floor/iron, +/area/centcom/interlink) "xqq" = ( /obj/structure/chair/sofa/bench{ dir = 4 @@ -17382,6 +18235,12 @@ /obj/machinery/vending/dorms, /turf/open/indestructible/hotelwood, /area/centcom/holding/cafe) +"xrz" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "xrA" = ( /obj/effect/landmark/start/assaultop, /obj/structure/chair/office/light{ @@ -17406,6 +18265,14 @@ /obj/machinery/light/directional/west, /turf/open/floor/carpet/black, /area/centcom/holding/cafe) +"xtm" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "xtQ" = ( /obj/effect/turf_decal/weather/dirt, /obj/effect/light_emitter/interlink, @@ -17448,6 +18315,12 @@ /obj/structure/fans/tiny/invisible, /turf/open/floor/wood, /area/centcom/holding/cafe/dorms) +"xxO" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron, +/area/centcom/interlink) "xyn" = ( /obj/structure/flora/grass/jungle/a/style_4, /obj/machinery/light/directional/north, @@ -17543,6 +18416,11 @@ }, /turf/open/misc/grass/planet, /area/centcom/holding/cafe/park) +"xFF" = ( +/obj/structure/chair/stool/bar/directional/north, +/obj/structure/disposalpipe/segment, +/turf/open/indestructible/hotelwood, +/area/centcom/holding/cafe) "xFU" = ( /obj/effect/turf_decal/sand, /turf/open/misc/beach/sand, @@ -17596,6 +18474,13 @@ /obj/structure/sign/poster/random/directional/west, /turf/open/floor/wood/tile, /area/centcom/interlink) +"xLe" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Interlink Shuttle" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/centcom/interlink) "xLz" = ( /obj/machinery/door/airlock/bathroom{ name = "Bathroom" @@ -17886,6 +18771,15 @@ }, /turf/open/floor/iron/white, /area/centcom/interlink) +"ydI" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/centcom/interlink) "ydM" = ( /obj/structure/fluff/beach_umbrella/engine, /turf/open/misc/beach/sand, @@ -24201,7 +25095,7 @@ tvw tvw qLQ aXG -xyz +sEi nYB ePw tvw @@ -25230,7 +26124,7 @@ ekE wOQ hvQ hvQ -hvQ +eKW bck tvw aWb @@ -25487,7 +26381,7 @@ jaf hvQ hvQ aTS -hvQ +eKW hvQ tvw aWb @@ -25744,7 +26638,7 @@ eXg hvQ deD tvw -hvQ +eKW dPd tvw kdy @@ -26001,7 +26895,7 @@ hvQ hvQ hvQ kfb -lvR +ayb wHJ tvw hZk @@ -26258,7 +27152,7 @@ hvQ hvQ hvQ hvQ -dGD +wUm nJp tvw kdy @@ -26772,7 +27666,7 @@ iPs iPs iPs fOv -dGD +wUm uPd tvw tvw @@ -27029,7 +27923,7 @@ iPs iPs iPs rDL -dGD +wUm wck tvw uis @@ -27543,7 +28437,7 @@ xgz jzh sIH lPi -iMY +hpl wck tvw sNg @@ -27800,7 +28694,7 @@ xgz pST oQW lPi -iMY +hpl wck tvw fzV @@ -28314,7 +29208,7 @@ lVL olE olE wtI -dGD +wUm nJp tvw tvw @@ -28571,7 +29465,7 @@ cRs pST sIH lPi -iMY +hpl cGt pHe saE @@ -28828,7 +29722,7 @@ olE pST oQW lPi -iMY +hpl nJp xPZ aXG @@ -29085,7 +29979,7 @@ iwK lPi lPi jHw -iMY +hpl nJp rYy tvw @@ -29342,7 +30236,7 @@ oIK kOZ kOZ wFF -oOC +ivR pSt cWG exf @@ -29598,8 +30492,8 @@ eYX mqE hvQ hvQ -hvQ -hvQ +fBP +lkp hvQ hvQ hvQ @@ -29855,7 +30749,7 @@ lPi aUh hvQ hvQ -hvQ +eKW hvQ hvQ hvQ @@ -30112,7 +31006,7 @@ lPi crf anv ybB -mqE +neS hvQ hvQ hvQ @@ -30369,7 +31263,7 @@ tvw lPi lPi tvw -iMY +hpl hvQ hvQ aBm @@ -30626,7 +31520,7 @@ xKN olE olE bwP -dGD +wUm hvQ hvQ hvQ @@ -30883,7 +31777,7 @@ fYY olE olE wtI -dGD +wUm hvQ hvQ bTH @@ -31397,7 +32291,7 @@ kOZ kOZ wHJ tGG -dGD +wUm hvQ hvQ hvQ @@ -31640,7 +32534,7 @@ rMF hES rDL hvQ -hvQ +eKW hvQ hvQ tGG @@ -31654,8 +32548,8 @@ hvQ hvQ cGt tGG -dGD -hvQ +hhj +fnX hvQ hvQ hvQ @@ -31897,23 +32791,23 @@ aXG jXO rDL hvQ -hvQ -hvQ -aTS -tGG -dGD -lrp -eYX +xxO +nRe +cbl +xLe +fIx +raA +rkX tWA -eYX -eYX -eYX -eYX +rkX +rkX +rkX +rkX bod -tGG +xLe mjK -mqE -lrp +vRs +fxA jsN eYX eYX @@ -32158,7 +33052,7 @@ lPi lPi tvw hoS -iMY +hpl nJp tvw tvw @@ -32169,8 +33063,8 @@ tvw tvw tvw jHw -iMY -nJp +xpU +oKf rYy tvw dHP @@ -32415,7 +33309,7 @@ vat vat cNw tvw -iMY +hpl nJp tvw iVr @@ -32672,7 +33566,7 @@ vat iov vat lPi -iMY +hpl nJp tvw tfe @@ -32929,7 +33823,7 @@ vat vat vat lPi -iMY +hpl nJp tvw tvw @@ -32940,7 +33834,7 @@ hVC bsj osk tvw -iMY +hpl xHU aDg fVr @@ -33186,7 +34080,7 @@ vat vat xmn lPi -iMY +hpl pSt kOZ sga @@ -33197,7 +34091,7 @@ bsj bsj fHR tvw -iMY +hpl xHU tvw jSW @@ -33443,7 +34337,7 @@ vat vat vat tvw -iMY +hpl lrp eYX aPe @@ -33711,7 +34605,7 @@ tvw tvw tvw tvw -iMY +hpl xHU aDg kLZ @@ -33937,27 +34831,27 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa fov -hES -aXG -aXG -aXG -pmJ -aXG -aXG -aXG -pmJ -aXG -aXG -aXG -aXG -aXG -pPI -dGD +pVr +nGq +gqT +fbS +jHi +dfW +dfW +dfW +ldc +dfW +vUg +dfW +ldc +dfW +dfW +dfW +dfW +dfW +jzj +lTq nJp tvw iVr @@ -33968,7 +34862,7 @@ nsT oYh nYF tvw -iMY +hpl xHU aDg fVr @@ -34194,10 +35088,10 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa +tvw +iTl +aqG +hzy tvw mtv eOx @@ -34205,8 +35099,8 @@ pZh pZh jtl aXG -aXG -xyz +otM +uii pHQ pZh pZh @@ -34214,7 +35108,7 @@ eOx jtl aXG cVm -dGD +wUm nJp tvw tfe @@ -34451,10 +35345,10 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa +tvw +bOv +rLG +bZy tvw bjh cAI @@ -34462,7 +35356,7 @@ mDs xqq tUz uYo -uYo +ydI uYo eNn xqq @@ -34471,7 +35365,7 @@ cAI phk aXG pPI -dGD +wUm nJp tvw tvw @@ -34482,7 +35376,7 @@ hVC bsj uDT tvw -iMY +hpl xHU tvw fVr @@ -34708,10 +35602,10 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa +tvw +qpp +lQD +qaM tvw aXG aXG @@ -34719,16 +35613,16 @@ eHo hvQ hvQ hvQ -hvQ -hvQ -hvQ -hvQ +xxO +nRe +nRe +fnX rSK aXG aXG jXO cVm -dGD +wUm pSt kOZ ubH @@ -34739,7 +35633,7 @@ bsj bsj fHR tvw -iMY +hpl xHU tvw fVr @@ -34965,10 +35859,10 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa +tvw +qpp +eGQ +aqG tvw aDg uTg @@ -34979,15 +35873,15 @@ tvw mjo tvw tvw -nzO +unr hTh alx aDg tvw tvw -ukp -lrp -eYX +jJi +raA +rkX jTQ tvw aFe @@ -34996,7 +35890,7 @@ bsj bsj bUO tvw -iMY +hpl xHU aDg fVr @@ -35222,10 +36116,10 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa +tvw +gEz +nKi +aqG tvw aXG bdI @@ -35236,7 +36130,7 @@ wZW kWH ism tvw -hvQ +eKW rSK cal aXG @@ -35253,7 +36147,7 @@ tvw tvw tvw tvw -iMY +hpl xHU aDg fVr @@ -35479,10 +36373,10 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa +tvw +qpp +mfH +aqG tvw dLq lsV @@ -35493,7 +36387,7 @@ jGH kWH rrA oln -hvQ +eKW shn dHD aXG @@ -35510,7 +36404,7 @@ nsT oYh nYF tvw -iMY +hpl xHU aDg rVQ @@ -35736,10 +36630,10 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa +tvw +qpp +tvw +tvw tvw aXG alO @@ -35750,7 +36644,7 @@ nTO kWH pnW rKT -hvQ +eKW hEK wYH aXG @@ -35993,9 +36887,9 @@ aaa aaa aaa aaa -aaa -aaa -aaa +rVP +uhT +tvw aaa tvw aXG @@ -36007,7 +36901,7 @@ lba kKo uhO oln -hvQ +eKW beb aXG aXG @@ -36024,7 +36918,7 @@ hVC bsj mUC tvw -iMY +hpl xHU tvw vLx @@ -36250,12 +37144,12 @@ aaa aaa aaa aaa +tvw +tvw +tvw aaa -aaa -aaa -aaa -ckV -hES +tvw +aXG aXG eHo amv @@ -36264,7 +37158,7 @@ aDg aDg aDg tvw -amv +afJ rSK aXG aXG @@ -36281,7 +37175,7 @@ bsj bsj fHR tvw -iMY +hpl xHU tvw vLx @@ -36511,16 +37405,16 @@ aaa aaa aaa aaa -tvw -aXG +ckV +hES aXG inr nrl rYR rYR -rYR -rYR -rYR +pGj +oCu +oCu ojv liU aXG @@ -37032,7 +37926,7 @@ aXG aXG aXG aXG -aXG +pFf aXG aXG aXG @@ -37052,7 +37946,7 @@ nsT oYh nYF tvw -iMY +hpl xHU tvw vLx @@ -37566,7 +38460,7 @@ hVC bsj cbF tvw -iMY +hpl xHU tvw aaa @@ -37823,7 +38717,7 @@ bsj bsj fHR tvw -iMY +hpl xHU tvw aaa @@ -38080,7 +38974,7 @@ bsj bsj bUO tvw -iMY +hpl xHU tvw aaa @@ -38594,7 +39488,7 @@ qzE gIO mMu xwC -oOC +ivR xHU tvw aaa @@ -38844,14 +39738,14 @@ pPw pPw pPw cnd +nua nmH nmH nmH nmH nmH nmH -nmH -nmH +kLC xHU tvw aaa @@ -62524,7 +63418,7 @@ ayo ahY aqf aUo -aUo +uZQ aUo aqf bcb @@ -62781,7 +63675,7 @@ alR aQd aqf aqy -aUo +uZQ agr aqf rTU @@ -63038,7 +63932,7 @@ axQ aRM aqf aPK -aUo +uZQ awQ aqf sRt @@ -63295,7 +64189,7 @@ aUo aUz aqf aYj -aUo +uZQ aKD aqf aqf @@ -63552,7 +64446,7 @@ aME gWT aqf aXd -aUo +uZQ aQa aqf dyU @@ -63809,7 +64703,7 @@ aqf aqf aqf aqf -aUo +uZQ aqf aPZ dDF @@ -64045,28 +64939,28 @@ auU aqf xpH aUo -aUo -aUo -aUo +xrz +igB +igB aOV -wDG -aUo -aUo -aOR -aOp -axL -azT +xFF +igB +igB +klb +qQp +bhN +iYD azT agG asC jZb aqf afr -atf +dqh aOb aSn aIU -aUo +uZQ bNi aqf bZt @@ -64302,7 +65196,7 @@ asp aqf lnP aPo -aUo +xtm aUo aUo bwG @@ -64312,18 +65206,18 @@ aUz aTb aBH avS -axO +siN axO axO aGo enf aqf aHP +uZQ aUo aUo aUo -aUo -aUo +uZQ jeI aqf aqf @@ -64569,18 +65463,18 @@ aUo aTb ayQ aOI -aOI -aKB +mKt +hYt aWq aDA -sIb -ang -aUo -aUo +hVr +xgK +igB +bGk aWh ahG aGY -aUo +fdP jeI aqf dbn @@ -64827,7 +65721,7 @@ aTb apA aOI aOI -aOI +mGi aKB aGo ayk @@ -65084,7 +65978,7 @@ aqf aGT apx apx -apx +tzr apx apx aoR @@ -65341,7 +66235,7 @@ aqf aqf aqf aka -aka +sWg aka aqf aqf @@ -65351,7 +66245,7 @@ aqf agV aUo aUo -aUo +atf aqf aqf ajj @@ -65598,7 +66492,7 @@ aqf pwO wVd aYc -aYc +iYh aYc kZK bON @@ -65855,7 +66749,7 @@ aqf ayt qVU qVU -qVU +rnV qVU qVU aJP @@ -66093,11 +66987,11 @@ aPf aPf ayI aPf -aPf -aPf -aPf -ekp -ayI +aqf +bYh +qAk +rEG +kNU ayI ayI ayI @@ -66110,11 +67004,11 @@ tsx tsx aBa aqX -qVU +ucc vhm rOn mxd -qVU +bOD tct aqf aAX @@ -66350,11 +67244,11 @@ aPf aPf ayI ayI -aPf -aPf -aPf -ekp -ayI +aqf +rfP +cfG +aqf +vKa ayI hea bNV @@ -66366,8 +67260,8 @@ wIO wIO wIO vzb -sUE -vhm +fuR +vlI qdG vdW bUS @@ -66607,10 +67501,10 @@ aPf ayI ayI ayI -aPf -aPf -aFP -agU +aqf +rfP +mKm +aqf mPR uIo aSt @@ -66864,10 +67758,10 @@ ayI ayI ayI aPf -aPf -asX -aFP -agU +aqf +rfP +cfG +aqf nXw aSt aSt @@ -67121,10 +68015,10 @@ ayI ayI aPf aPf -aPf -aFP -aFP -agU +aqf +wqV +aqf +aqf nXw aIr aIr @@ -68153,7 +69047,7 @@ ajj kMV aFP agU -hpl +gtO rXY rXY rXY @@ -70209,18 +71103,18 @@ ajj ajj aFP agU -ayI -ayI -ayI +gBT +tez +tez mSQ -aQE -aQE +gow +gow jYy -ayI -ayI -ayI -ayI -eaJ +tez +tez +tez +tez +liW sfd aZU vgQ diff --git a/_maps/skyrat/lazy_templates/deathmatch/deep_space.dmm b/_maps/skyrat/lazy_templates/deathmatch/deep_space.dmm new file mode 100644 index 00000000000..99992152113 --- /dev/null +++ b/_maps/skyrat/lazy_templates/deathmatch/deep_space.dmm @@ -0,0 +1,3405 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ah" = ( +/obj/effect/mob_spawn/corpse/human/clown, +/obj/item/stack/ore/bananium, +/turf/open/space/basic, +/area/deathmatch) +"aq" = ( +/obj/item/storage/toolbox/guncase/nova/opfor/rebar_crossbow, +/turf/open/floor/plating/airless, +/area/deathmatch) +"aF" = ( +/obj/structure/fluff/tram_rail/floor, +/obj/item/assembly/igniter, +/turf/open/floor/plating/airless, +/area/deathmatch) +"aG" = ( +/obj/structure/sign/flag/azulea/directional/south{ + pixel_y = -64 + }, +/turf/open/space/basic, +/area/deathmatch) +"aH" = ( +/obj/structure/fluff/tram_rail/floor, +/turf/open/misc/asteroid/airless, +/area/deathmatch) +"bL" = ( +/obj/effect/turf_decal/sand/plating, +/obj/item/stack/sheet/mineral/wood, +/turf/open/floor/plating/airless, +/area/deathmatch) +"bN" = ( +/turf/open/floor/iron/corner{ + dir = 1 + }, +/area/deathmatch) +"bP" = ( +/obj/structure/lattice/catwalk, +/obj/structure/marker_beacon/yellow, +/turf/open/space/basic, +/area/deathmatch) +"bW" = ( +/obj/structure/flora/tree/palm, +/turf/open/floor/grass, +/area/deathmatch) +"cb" = ( +/obj/structure/sign/warning/directional/south, +/turf/closed/mineral/random, +/area/deathmatch) +"cF" = ( +/obj/structure/lattice/catwalk, +/obj/item/assembly/igniter, +/turf/open/space/basic, +/area/deathmatch) +"cT" = ( +/obj/machinery/power/shuttle_engine/heater{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/deathmatch) +"cW" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/sign/warning/directional/south, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/airless, +/area/deathmatch) +"cX" = ( +/obj/structure/flora/rock/style_random, +/turf/open/misc/asteroid/airless, +/area/deathmatch) +"dh" = ( +/obj/structure/sign/warning/directional/west, +/turf/open/space/basic, +/area/deathmatch) +"dx" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/turf/open/floor/iron/white, +/area/deathmatch) +"dH" = ( +/turf/closed/wall, +/area/deathmatch) +"eb" = ( +/obj/machinery/computer{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium, +/area/deathmatch) +"el" = ( +/obj/item/gun/energy/recharge/kinetic_accelerator, +/obj/item/borg/upgrade/modkit/damage, +/obj/item/borg/upgrade/modkit/damage, +/obj/item/borg/upgrade/modkit/range, +/obj/item/borg/upgrade/modkit/range, +/obj/structure/glowshroom/single, +/turf/open/misc/asteroid/airless, +/area/deathmatch) +"em" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 1 + }, +/obj/machinery/vending/wallmed/directional/north, +/turf/open/floor/iron/white, +/area/deathmatch) +"ep" = ( +/obj/structure/sign/warning/directional/east, +/obj/machinery/power/floodlight, +/obj/effect/light_emitter{ + set_cap = 2; + light_color = "#DEEFFF"; + set_luminosity = 4 + }, +/obj/effect/turf_decal/sand/plating, +/obj/structure/cable, +/turf/open/floor/plating/airless, +/area/deathmatch) +"eB" = ( +/obj/machinery/door/airlock/shuttle, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/titanium/tiled/blue/airless, +/area/deathmatch) +"eE" = ( +/obj/effect/turf_decal/sand/plating, +/obj/item/stack/rods/ten, +/turf/open/floor/plating/airless, +/area/deathmatch) +"fd" = ( +/obj/structure/railing, +/obj/effect/mapping_helpers/broken_floor, +/obj/item/grenade/c4/x4, +/turf/open/floor/plating/airless, +/area/deathmatch) +"fs" = ( +/obj/machinery/light/broken/directional/south, +/obj/machinery/porta_turret_construct{ + anchored = 1 + }, +/turf/open/floor/iron, +/area/deathmatch) +"fF" = ( +/obj/item/mecha_ammo/lmg, +/obj/item/mecha_ammo/lmg{ + pixel_y = 12 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/sand/plating, +/obj/item/mecha_parts/mecha_equipment/thrusters/ion, +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg{ + pixel_y = -8 + }, +/turf/open/floor/plating/airless, +/area/deathmatch) +"fG" = ( +/obj/structure/lattice, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/space/basic, +/area/deathmatch) +"fH" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/fluff/tram_rail/floor{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/deathmatch) +"fL" = ( +/turf/closed/indestructible/fakedoor/maintenance, +/area/deathmatch) +"fP" = ( +/obj/structure/railing/corner/end/flip{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/deathmatch) +"gd" = ( +/obj/structure/fluff/iced_abductor, +/turf/open/misc/asteroid, +/area/deathmatch) +"gf" = ( +/obj/machinery/light/small/directional/west, +/obj/structure/sign/warning/vacuum/directional/west, +/obj/machinery/suit_storage_unit/open, +/obj/item/tank/internals/oxygen, +/turf/open/floor/plating, +/area/deathmatch) +"gC" = ( +/obj/structure/fluff/tram_rail{ + dir = 1 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/deathmatch) +"gK" = ( +/obj/machinery/door/airlock/external, +/obj/structure/fans/tiny, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/iron/white/small, +/area/deathmatch) +"gP" = ( +/obj/effect/spawner/random/trash/food_packaging, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/herringbone, +/area/deathmatch) +"hk" = ( +/obj/structure/sign/warning/directional/west, +/turf/open/misc/asteroid/dug, +/area/deathmatch) +"hu" = ( +/obj/item/stack/sheet/iron/ten, +/obj/item/stack/cable_coil, +/turf/open/floor/plating/airless, +/area/deathmatch) +"hH" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted, +/obj/structure/rack/shelf, +/obj/item/storage/medkit/fire, +/obj/item/storage/medkit/brute{ + pixel_y = 6 + }, +/turf/open/floor/iron/white, +/area/deathmatch) +"hJ" = ( +/obj/structure/table/wood, +/obj/item/storage/toolbox/guncase/nova/pistol/opfor/wespe{ + pixel_x = 2; + pixel_y = 7 + }, +/obj/item/serviette_used/colonial{ + pixel_y = -3; + pixel_x = -4; + layer = 3.1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/reagent_containers/cup/glass/coffee/colonial/empty{ + pixel_y = 3; + pixel_x = 6; + layer = 3.1 + }, +/turf/open/floor/wood, +/area/deathmatch) +"hM" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"ip" = ( +/turf/open/floor/plating, +/area/deathmatch) +"ir" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/effect/turf_decal/sand/plating, +/turf/open/floor/plating/airless, +/area/deathmatch) +"is" = ( +/obj/machinery/light/broken/directional/north, +/obj/machinery/porta_turret_construct{ + anchored = 1 + }, +/turf/open/floor/iron, +/area/deathmatch) +"iV" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/small, +/area/deathmatch) +"jb" = ( +/mob/living/basic/cow/moonicorn, +/turf/open/misc/asteroid, +/area/deathmatch) +"jS" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, +/area/deathmatch) +"jY" = ( +/obj/structure/chair/wood/wings{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/deathmatch) +"kK" = ( +/obj/structure/table_frame, +/turf/open/floor/plating, +/area/deathmatch) +"kO" = ( +/obj/effect/mob_spawn/corpse/human/miner/explorer, +/turf/open/misc/asteroid/dug, +/area/deathmatch) +"kX" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/floor/iron/white, +/area/deathmatch) +"lb" = ( +/obj/item/resonator/upgraded, +/obj/effect/turf_decal/sand/plating, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/airless, +/area/deathmatch) +"lf" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/mapping_helpers/broken_floor, +/obj/item/storage/toolbox/guncase/nova/opfor/renoster, +/obj/item/sign/flag/terragov{ + pixel_y = 4 + }, +/turf/open/floor/mineral/titanium/tiled/blue/airless, +/area/deathmatch) +"li" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/mob_spawn/corpse/human/charredskeleton, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, +/area/deathmatch) +"ll" = ( +/turf/closed/mineral/random/asteroid/rockplanet, +/area/deathmatch) +"lv" = ( +/obj/structure/fans/tiny, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/obj/machinery/door/airlock/titanium, +/turf/open/floor/iron/small, +/area/deathmatch) +"lE" = ( +/obj/effect/mob_spawn/corpse/human/monkey, +/turf/open/space/basic, +/area/deathmatch) +"lF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/fluff/fake_scrubber, +/turf/open/floor/iron/herringbone, +/area/deathmatch) +"lH" = ( +/obj/structure/lattice/catwalk, +/obj/item/stack/sheet/iron/five, +/turf/open/space/basic, +/area/deathmatch) +"lL" = ( +/obj/item/storage/toolbox/guncase/nova/pistol/opfor/m1911, +/obj/effect/decal/cleanable/dirt, +/obj/item/sign/flag/syndicate{ + pixel_y = 4 + }, +/obj/effect/turf_decal/sand/plating, +/turf/open/floor/plating/airless, +/area/deathmatch) +"lV" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating/airless, +/area/deathmatch) +"lZ" = ( +/obj/machinery/power/tracker, +/obj/structure/cable, +/turf/open/floor/plating/airless, +/area/deathmatch) +"mi" = ( +/obj/effect/spawner/structure/window/reinforced/no_firelock, +/turf/open/floor/plating, +/area/deathmatch) +"mq" = ( +/turf/open/floor/iron/half, +/area/deathmatch) +"mL" = ( +/turf/closed/indestructible/fakedoor, +/area/deathmatch) +"mO" = ( +/obj/effect/turf_decal/stripes/line, +/obj/item/stack/sheet/iron/ten, +/turf/open/floor/plating/airless, +/area/deathmatch) +"nc" = ( +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/deathmatch) +"ne" = ( +/obj/structure/lattice/catwalk, +/obj/structure/reagent_dispensers/watertank, +/turf/open/space/basic, +/area/deathmatch) +"ni" = ( +/obj/machinery/door/airlock/survival_pod/glass{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/structure/fans/tiny, +/turf/open/floor/grass, +/area/deathmatch) +"nu" = ( +/obj/effect/light_emitter{ + set_cap = 2; + light_color = "#DEEFFF"; + set_luminosity = 4 + }, +/obj/item/stack/rods/twentyfive, +/turf/open/floor/plating/airless, +/area/deathmatch) +"ny" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/space/basic, +/area/deathmatch) +"nE" = ( +/obj/structure/fluff/fake_vent, +/turf/open/floor/iron/corner{ + dir = 8 + }, +/area/deathmatch) +"nJ" = ( +/obj/structure/sign/flag/azulea/directional/north{ + pixel_y = 64 + }, +/turf/open/space/basic, +/area/deathmatch) +"nK" = ( +/mob/living/basic/pet/cat/space, +/turf/open/space/basic, +/area/deathmatch) +"nQ" = ( +/obj/machinery/light/floor/broken, +/obj/effect/light_emitter{ + set_cap = 2; + light_color = "#DEEFFF"; + set_luminosity = 4 + }, +/turf/open/floor/plating/airless, +/area/deathmatch) +"nW" = ( +/obj/structure/girder, +/turf/open/floor/plating/airless, +/area/deathmatch) +"og" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/closed/wall/mineral/titanium, +/area/deathmatch) +"oi" = ( +/obj/structure/flora/bush/flowers_br/style_random, +/turf/open/floor/grass, +/area/deathmatch) +"oJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/sand/plating, +/turf/open/floor/plating/airless, +/area/deathmatch) +"oO" = ( +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/deathmatch) +"oU" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"oZ" = ( +/obj/machinery/light/directional/north, +/obj/effect/decal/cleanable/dirt, +/obj/structure/fluff/fake_scrubber, +/turf/open/floor/iron/herringbone, +/area/deathmatch) +"pf" = ( +/obj/structure/fluff/tram_rail/anchor, +/obj/structure/lattice, +/turf/open/space/basic, +/area/deathmatch) +"pk" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 4 + }, +/obj/item/stack/cable_coil, +/turf/open/space/basic, +/area/deathmatch) +"px" = ( +/obj/structure/railing{ + dir = 5 + }, +/turf/open/floor/plating/airless, +/area/deathmatch) +"pK" = ( +/obj/structure/fluff/tram_rail, +/obj/structure/lattice, +/turf/open/space/basic, +/area/deathmatch) +"pP" = ( +/obj/structure/flora/rock/pile/icy/style_random, +/turf/open/floor/grass, +/area/deathmatch) +"qg" = ( +/turf/closed/wall/mineral/titanium, +/area/deathmatch) +"qi" = ( +/obj/structure/lattice/catwalk, +/obj/item/crowbar/power, +/turf/open/space/basic, +/area/deathmatch) +"qv" = ( +/obj/effect/light_emitter{ + set_cap = 2; + light_color = "#DEEFFF"; + set_luminosity = 4 + }, +/turf/open/floor/plating/airless, +/area/deathmatch) +"qw" = ( +/turf/closed/mineral/random, +/area/deathmatch) +"qK" = ( +/obj/effect/turf_decal/siding/wood, +/mob/living/basic/bot/cleanbot/autopatrol, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"rb" = ( +/obj/item/crowbar/large/doorforcer, +/turf/open/floor/plating/airless, +/area/deathmatch) +"rg" = ( +/turf/open/floor/iron/corner, +/area/deathmatch) +"rj" = ( +/obj/item/weldingtool, +/turf/open/floor/plating/foam, +/area/deathmatch) +"ry" = ( +/obj/structure/sign/warning/directional/north, +/obj/effect/turf_decal/sand/plating, +/obj/structure/cable, +/obj/machinery/power/port_gen/pacman/pre_loaded, +/turf/open/floor/plating/airless, +/area/deathmatch) +"rC" = ( +/turf/open/floor/plating/foam, +/area/deathmatch) +"rG" = ( +/obj/effect/decal/cleanable/glass/titanium, +/obj/item/storage/pod/directional/south, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/computer/pod{ + dir = 8 + }, +/obj/machinery/light/broken/directional/south, +/turf/open/floor/mineral/titanium/tiled/blue/airless, +/area/deathmatch) +"rN" = ( +/turf/closed/mineral/asteroid, +/area/deathmatch) +"sy" = ( +/obj/structure/lattice/catwalk, +/obj/item/toy/crayon/spraycan{ + pixel_x = -5; + pixel_y = 4 + }, +/turf/open/space/basic, +/area/deathmatch) +"sT" = ( +/obj/structure/falsewall, +/turf/open/misc/asteroid/airless, +/area/deathmatch) +"sW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/fluff/fake_vent, +/turf/open/floor/iron/herringbone, +/area/deathmatch) +"tc" = ( +/obj/structure/fans/tiny/shield, +/obj/machinery/door/poddoor/shutters{ + id = "dm_deepspace" + }, +/turf/open/floor/vault, +/area/deathmatch) +"tA" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/holosign/barrier/engineering, +/turf/open/floor/plating/airless, +/area/deathmatch) +"uv" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/sign/warning/yes_smoking/circle/directional/north, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"uA" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing/corner/end{ + dir = 8 + }, +/turf/open/space/basic, +/area/deathmatch) +"uI" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"uX" = ( +/obj/structure/sign/departments/engineering/directional/south, +/obj/machinery/light/directional/south, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/herringbone, +/area/deathmatch) +"ve" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 8 + }, +/obj/item/storage/toolbox/guncase/nova/pistol/opfor/egun_mini{ + pixel_y = 3 + }, +/obj/item/sign/flag/mars{ + pixel_y = 7 + }, +/turf/open/floor/iron/white, +/area/deathmatch) +"vh" = ( +/obj/machinery/light/directional/north, +/obj/machinery/porta_turret/dm, +/turf/open/floor/iron, +/area/deathmatch) +"vn" = ( +/obj/effect/spawner/random/structure/billboard, +/turf/open/misc/asteroid/airless, +/area/deathmatch) +"vs" = ( +/obj/vehicle/sealed/mecha/ripley, +/turf/open/floor/plating/foam, +/area/deathmatch) +"vu" = ( +/turf/closed/indestructible/fakedoor/glass_airlock, +/area/deathmatch) +"vy" = ( +/obj/effect/mob_spawn/corpse/human/damaged, +/turf/open/space/basic, +/area/deathmatch) +"vz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/oil, +/turf/open/floor/iron/herringbone, +/area/deathmatch) +"vB" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/titanium, +/turf/open/floor/iron/small, +/area/deathmatch) +"vJ" = ( +/obj/structure/railing{ + dir = 9 + }, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/floor/plating/airless, +/area/deathmatch) +"vY" = ( +/obj/structure/fluff/tram_rail/floor{ + dir = 1 + }, +/obj/item/wrench/bolter, +/turf/open/floor/plating/airless, +/area/deathmatch) +"wd" = ( +/obj/structure/fluff/tram_rail/anchor, +/turf/open/space/basic, +/area/deathmatch) +"wf" = ( +/turf/open/space/basic, +/area/deathmatch) +"wi" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/structure/glowshroom/single, +/turf/open/misc/asteroid/airless, +/area/deathmatch) +"wu" = ( +/obj/machinery/power/solar{ + id = "foreport"; + name = "Fore-Port Solar Array" + }, +/obj/structure/cable, +/turf/open/floor/iron/solarpanel/airless, +/area/deathmatch) +"wL" = ( +/obj/item/grown/bananapeel, +/turf/open/space/basic, +/area/deathmatch) +"xa" = ( +/obj/effect/turf_decal/siding/wood/corner, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/sign/flag/nri/directional/east, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"xp" = ( +/obj/structure/sign/directions/engineering/directional/south{ + pixel_y = -36 + }, +/obj/structure/sign/directions/supply/directional/south{ + pixel_y = -28; + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"xB" = ( +/obj/machinery/door/airlock/survival_pod/glass, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/structure/fans/tiny, +/turf/open/floor/grass, +/area/deathmatch) +"xJ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/mob_spawn/corpse/human/engineer, +/turf/open/floor/plating/airless, +/area/deathmatch) +"xL" = ( +/obj/structure/sign/poster/contraband/kss13/directional/west, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"xM" = ( +/obj/structure/marker_beacon{ + light_color = "#FFE8AA"; + light_range = 20 + }, +/turf/open/floor/grass, +/area/deathmatch) +"yb" = ( +/mob/living/simple_animal/pet/gondola, +/obj/effect/light_emitter/fake_outdoors, +/turf/open/floor/grass, +/area/deathmatch) +"yf" = ( +/obj/effect/mob_spawn/corpse/human/nanotrasensoldier, +/obj/effect/decal/cleanable/blood/splatter/over_window{ + pixel_x = -32 + }, +/obj/effect/decal/cleanable/blood/gibs, +/turf/open/floor/iron, +/area/deathmatch) +"yg" = ( +/turf/closed/wall/r_wall/syndicate, +/area/deathmatch) +"yl" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/transport/crossing_signal/northeast, +/turf/open/floor/plating/airless, +/area/deathmatch) +"ys" = ( +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/deathmatch) +"yt" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/closet/crate/bin, +/obj/item/reagent_containers/hypospray/medipen/deforest/adrenaline, +/obj/effect/spawner/random/trash/crushed_can, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"yu" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"yw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/shipping_container/kahraman/alt, +/turf/open/floor/plating/airless, +/area/deathmatch) +"yB" = ( +/obj/structure/lattice, +/obj/structure/marker_beacon/cerulean, +/turf/open/space/basic, +/area/deathmatch) +"yL" = ( +/obj/structure/sign/warning/directional/north, +/turf/closed/indestructible/reinforced, +/area/deathmatch) +"yN" = ( +/turf/closed/indestructible/fakedoor/engineering, +/area/deathmatch) +"yO" = ( +/obj/structure/ore_box, +/obj/effect/turf_decal/sand/plating, +/turf/open/floor/plating/airless, +/area/deathmatch) +"yP" = ( +/obj/structure/fluff/fake_scrubber, +/turf/open/floor/iron/white, +/area/deathmatch) +"za" = ( +/obj/structure/sign/warning/directional/north, +/turf/closed/mineral/random, +/area/deathmatch) +"zj" = ( +/obj/structure/flora/bush/fullgrass/style_random, +/turf/open/floor/grass, +/area/deathmatch) +"zk" = ( +/obj/effect/decal/cleanable/greenglow, +/turf/open/floor/iron/white, +/area/deathmatch) +"zB" = ( +/obj/item/weldingtool, +/turf/open/floor/plating/airless, +/area/deathmatch) +"zC" = ( +/obj/effect/spawner/random/structure/grille, +/turf/open/floor/plating/airless, +/area/deathmatch) +"zE" = ( +/obj/machinery/porta_turret/syndicate{ + on = 0; + dir = 9 + }, +/turf/closed/wall/r_wall/syndicate, +/area/deathmatch) +"zJ" = ( +/obj/structure/fluff/tram_rail/floor{ + dir = 1 + }, +/turf/open/misc/asteroid/airless, +/area/deathmatch) +"zY" = ( +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/structure/fans/tiny, +/turf/open/floor/iron/white/small, +/area/deathmatch) +"Ai" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/turf/open/floor/iron/white, +/area/deathmatch) +"Ar" = ( +/obj/structure/holosign/barrier/engineering, +/obj/effect/turf_decal/sand/plating, +/turf/open/floor/plating/airless, +/area/deathmatch) +"AD" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/space/basic, +/area/deathmatch) +"AJ" = ( +/obj/effect/turf_decal/tile/blue/half{ + dir = 1 + }, +/obj/structure/sign/departments/exam_room/directional/north, +/turf/open/floor/iron/white, +/area/deathmatch) +"AM" = ( +/obj/structure/fluff/tram_rail/anchor{ + dir = 1 + }, +/turf/open/space/basic, +/area/deathmatch) +"AY" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/plating/airless, +/area/deathmatch) +"Bc" = ( +/obj/structure/railing/corner/end/flip{ + dir = 4 + }, +/obj/effect/turf_decal/caution, +/obj/effect/turf_decal/arrows{ + dir = 1; + pixel_y = -12 + }, +/turf/open/floor/plating/airless, +/area/deathmatch) +"Bh" = ( +/turf/open/floor/vault, +/area/deathmatch) +"Bx" = ( +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/deathmatch) +"Bz" = ( +/obj/machinery/light/small/directional/south, +/obj/structure/sign/warning/vacuum/directional/south, +/obj/machinery/suit_storage_unit/open, +/obj/item/tank/internals/oxygen, +/turf/open/floor/plating, +/area/deathmatch) +"BX" = ( +/obj/effect/portal/permanent{ + id = "dm_deepspace" + }, +/turf/open/space/basic, +/area/deathmatch) +"CA" = ( +/obj/structure/fluff/tram_rail/floor{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/deathmatch) +"CE" = ( +/obj/structure/fluff/fake_camera{ + dir = 1 + }, +/turf/open/space/basic, +/area/deathmatch) +"CP" = ( +/obj/structure/rack, +/obj/machinery/light/directional/north, +/obj/item/melee/energy/sword/saber/red{ + pixel_x = 8; + pixel_y = 8 + }, +/obj/machinery/button/door/directional/east{ + id = "dm_deepspace" + }, +/turf/open/floor/iron, +/area/deathmatch) +"CT" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/plating/airless, +/area/deathmatch) +"CV" = ( +/obj/machinery/nuclearbomb{ + anchored = 1 + }, +/obj/effect/light_emitter{ + set_cap = 2; + light_color = "#DEEFFF"; + set_luminosity = 4 + }, +/turf/open/floor/iron/recharge_floor, +/area/deathmatch) +"CW" = ( +/obj/structure/sign/nanotrasen{ + pixel_y = 32 + }, +/turf/open/space/basic, +/area/deathmatch) +"CY" = ( +/obj/effect/mob_spawn/corpse/human/doctor, +/turf/open/space/basic, +/area/deathmatch) +"Di" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing/corner/end/flip{ + dir = 4 + }, +/turf/open/space/basic, +/area/deathmatch) +"Dn" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/flora/bush/large/style_random, +/turf/open/floor/grass, +/area/deathmatch) +"Dy" = ( +/obj/structure/chair/wood/wings{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/deathmatch) +"DD" = ( +/obj/machinery/vending/cola/pwr_game, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/fluff/fake_camera{ + dir = 10 + }, +/turf/open/floor/wood, +/area/deathmatch) +"DP" = ( +/obj/item/clothing/glasses/welding/up, +/turf/open/floor/plating/foam, +/area/deathmatch) +"DW" = ( +/obj/item/storage/belt/grenade{ + pixel_x = 10; + pixel_y = -7 + }, +/obj/item/grenade/smokebomb{ + pixel_x = 13; + pixel_y = -6 + }, +/obj/item/grenade/smokebomb{ + pixel_x = -12; + pixel_y = -10 + }, +/obj/item/grenade/empgrenade{ + pixel_x = -9; + pixel_y = 16 + }, +/obj/item/grenade/stingbang{ + pixel_y = 8; + pixel_x = 10 + }, +/obj/effect/mob_spawn/corpse/human/cin_soldier, +/turf/open/floor/plating/airless, +/area/deathmatch) +"Eb" = ( +/turf/closed/indestructible/reinforced, +/area/deathmatch) +"El" = ( +/obj/structure/fluff/tram_rail, +/turf/open/space/basic, +/area/deathmatch) +"Eu" = ( +/obj/structure/railing/corner/end/flip{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/deathmatch) +"EB" = ( +/obj/structure/lattice/catwalk, +/obj/structure/marker_beacon/burgundy, +/turf/open/space/basic, +/area/deathmatch) +"EI" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/obj/item/storage/toolbox/guncase/nova/opfor/kiboko, +/obj/item/sign/flag/terragov{ + pixel_y = 4; + layer = 3.1 + }, +/turf/open/space/basic, +/area/deathmatch) +"EJ" = ( +/obj/structure/sign/departments/cargo/directional/west, +/obj/effect/turf_decal/siding/wood, +/obj/machinery/light/directional/west, +/obj/effect/spawner/random/trash/food_packaging, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"Fp" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/external, +/turf/open/floor/iron/white/small, +/area/deathmatch) +"Fy" = ( +/obj/machinery/light/directional/east, +/obj/effect/decal/cleanable/dirt, +/obj/structure/fluff/fake_vent, +/turf/open/floor/iron/herringbone, +/area/deathmatch) +"FN" = ( +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/deathmatch) +"FP" = ( +/turf/open/misc/asteroid/dug, +/area/deathmatch) +"FS" = ( +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/structure/fans/tiny, +/turf/open/floor/iron/white/small, +/area/deathmatch) +"FT" = ( +/obj/structure/sign/nanotrasen{ + pixel_y = -32 + }, +/turf/open/space/basic, +/area/deathmatch) +"FZ" = ( +/mob/living/simple_animal/pet/gondola, +/obj/structure/flora/bush/flowers_yw/style_random, +/turf/open/floor/grass, +/area/deathmatch) +"Gl" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted, +/obj/structure/rack/shelf, +/obj/item/storage/medkit/robotic_repair/stocked, +/turf/open/floor/iron/white, +/area/deathmatch) +"Gq" = ( +/obj/structure/fluff/fake_scrubber, +/turf/open/floor/iron/corner{ + dir = 4 + }, +/area/deathmatch) +"Gr" = ( +/obj/effect/decal/cleanable/rubble, +/turf/open/misc/asteroid/airless, +/area/deathmatch) +"Gu" = ( +/obj/structure/lattice, +/obj/machinery/light/broken/directional/north, +/turf/open/space/basic, +/area/deathmatch) +"GM" = ( +/obj/effect/turf_decal/sand/plating, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/airless, +/area/deathmatch) +"Hc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mob_spawn/corpse/human/cargo_tech, +/turf/open/floor/iron/herringbone, +/area/deathmatch) +"Hg" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/floor/grass, +/area/deathmatch) +"Hv" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"HA" = ( +/obj/structure/flora/rock/pile/icy/style_random, +/turf/open/misc/asteroid/airless, +/area/deathmatch) +"HH" = ( +/obj/structure/chair/comfy/shuttle/tactical{ + dir = 8 + }, +/obj/effect/light_emitter{ + set_cap = 2; + light_color = "#DEEFFF"; + set_luminosity = 4 + }, +/obj/item/storage/toolbox/guncase/nova/opfor/laser, +/turf/open/floor/mineral/plastitanium, +/area/deathmatch) +"HI" = ( +/obj/machinery/power/shuttle_engine/propulsion/right{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/deathmatch) +"HK" = ( +/obj/effect/mob_spawn/corpse/human/nanotrasensoldier, +/obj/effect/decal/cleanable/blood/gibs, +/turf/open/floor/plating/airless, +/area/deathmatch) +"HS" = ( +/obj/item/mecha_parts/mecha_equipment/thrusters/ion, +/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/kill, +/obj/item/mecha_parts/mecha_equipment/drill, +/turf/open/floor/plating/airless, +/area/deathmatch) +"HZ" = ( +/obj/structure/sign/warning/directional/east, +/turf/open/misc/asteroid/airless, +/area/deathmatch) +"Ic" = ( +/obj/structure/flora/rock/pile/icy/style_random, +/mob/living/basic/carp, +/obj/structure/festivus/anchored, +/turf/open/misc/asteroid/airless, +/area/deathmatch) +"Iv" = ( +/obj/structure/lattice/catwalk, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/space/basic, +/area/deathmatch) +"Iw" = ( +/turf/closed/indestructible/fakeglass, +/area/deathmatch) +"Ix" = ( +/obj/structure/sign/warning/directional/north, +/obj/structure/lattice, +/turf/open/space/basic, +/area/deathmatch) +"IC" = ( +/obj/machinery/door/airlock/survival_pod/glass{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/structure/fans/tiny, +/turf/open/floor/grass, +/area/deathmatch) +"IG" = ( +/obj/structure/water_source/puddle, +/obj/structure/flora/bush/reed/style_random, +/turf/open/floor/grass, +/area/deathmatch) +"IK" = ( +/obj/structure/rack, +/obj/machinery/light/directional/south, +/obj/item/melee/energy/sword/saber/blue{ + pixel_x = 8; + pixel_y = 8 + }, +/obj/machinery/button/door/directional/west{ + id = "dm_deepspace" + }, +/turf/open/floor/iron, +/area/deathmatch) +"IT" = ( +/obj/structure/sign/poster/contraband/free_drone/directional/south, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/vending/coffee, +/turf/open/floor/wood, +/area/deathmatch) +"IU" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 4 + }, +/obj/structure/lattice, +/turf/open/misc/asteroid/airless, +/area/deathmatch) +"IX" = ( +/obj/structure/marker_beacon{ + light_color = "#FFE8AA"; + light_range = 20 + }, +/mob/living/simple_animal/pet/gondola, +/turf/open/floor/grass, +/area/deathmatch) +"IY" = ( +/obj/effect/spawner/random/trash/cigbutt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/herringbone, +/area/deathmatch) +"Jb" = ( +/obj/structure/sign/departments/maint/directional/west, +/obj/machinery/light/directional/west, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/vomit, +/turf/open/floor/iron/herringbone, +/area/deathmatch) +"Jn" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/floor/plating/airless, +/area/deathmatch) +"Jv" = ( +/obj/effect/turf_decal/sand/plating, +/turf/open/floor/plating/airless, +/area/deathmatch) +"Kf" = ( +/obj/effect/decal/cleanable/blood/footprints{ + pixel_y = -21 + }, +/turf/open/floor/plating/airless, +/area/deathmatch) +"Kh" = ( +/mob/living/simple_animal/pet/gondola, +/turf/open/floor/grass, +/area/deathmatch) +"Ki" = ( +/obj/item/toy/plush/lizard_plushie/space, +/turf/open/misc/asteroid/airless, +/area/deathmatch) +"Km" = ( +/obj/effect/decal/cleanable/ash, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/herringbone, +/area/deathmatch) +"Ko" = ( +/obj/item/storage/toolbox/guncase/rocketlauncher{ + weapon_to_spawn = /obj/item/gun/ballistic/rocketlauncher/unrestricted; + pixel_x = 6 + }, +/mob/living/basic/carp/mega, +/turf/open/misc/asteroid/airless, +/area/deathmatch) +"KJ" = ( +/turf/open/floor/plating/airless, +/area/deathmatch) +"KK" = ( +/obj/structure/sign/warning/directional/north, +/obj/effect/turf_decal/sand/plating, +/turf/open/floor/plating/airless, +/area/deathmatch) +"KN" = ( +/obj/structure/barricade/wooden, +/obj/structure/fans/tiny/invisible, +/turf/open/misc/asteroid/airless, +/area/deathmatch) +"KQ" = ( +/obj/effect/spawner/random/structure/grille, +/turf/open/space/basic, +/area/deathmatch) +"Lw" = ( +/obj/structure/lattice/catwalk, +/obj/item/ammo_casing/rebar/syndie, +/obj/effect/decal/cleanable/blood, +/turf/open/space/basic, +/area/deathmatch) +"LO" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/herringbone, +/area/deathmatch) +"LV" = ( +/obj/structure/flora/bush/flowers_yw/style_random, +/turf/open/floor/grass, +/area/deathmatch) +"Mh" = ( +/obj/structure/chair/comfy/shuttle/tactical{ + dir = 8 + }, +/obj/effect/light_emitter{ + set_cap = 2; + light_color = "#DEEFFF"; + set_luminosity = 4 + }, +/obj/item/storage/toolbox/guncase/nova/pistol/opfor/plasma_pistol, +/turf/open/floor/mineral/plastitanium, +/area/deathmatch) +"Mw" = ( +/obj/structure/spacevine, +/turf/open/misc/asteroid/airless, +/area/deathmatch) +"MS" = ( +/obj/structure/sign/warning/directional/west, +/obj/structure/flora/rock/style_random, +/turf/open/misc/asteroid/airless, +/area/deathmatch) +"Nc" = ( +/obj/structure/shipping_container/cybersun, +/turf/open/floor/plating/airless, +/area/deathmatch) +"Ny" = ( +/obj/structure/railing/corner/end{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/mapping_helpers/broken_floor, +/obj/item/grenade/c4/x4, +/turf/open/floor/plating/airless, +/area/deathmatch) +"NF" = ( +/obj/structure/bed/medical/emergency, +/obj/effect/landmark/deathmatch_player_spawn, +/turf/open/space/basic, +/area/deathmatch) +"NK" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/fluff/tram_rail/floor, +/turf/open/floor/plating/airless, +/area/deathmatch) +"NP" = ( +/obj/item/storage/box/smart_metal_foam, +/turf/open/floor/plating/airless, +/area/deathmatch) +"NS" = ( +/obj/structure/fluff/fake_vent, +/turf/open/floor/iron/white, +/area/deathmatch) +"Od" = ( +/obj/item/gun/ballistic/rifle/boltaction/pipegun/prime, +/obj/item/storage/pouch/ammo, +/obj/item/ammo_casing/shotgun/scatterlaser, +/obj/item/ammo_casing/shotgun/scatterlaser, +/obj/item/ammo_casing/shotgun/scatterlaser, +/turf/open/misc/asteroid/airless, +/area/deathmatch) +"Ov" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, +/turf/open/floor/plating, +/area/deathmatch) +"OC" = ( +/obj/item/pickaxe/mini, +/turf/open/misc/asteroid/dug, +/area/deathmatch) +"OG" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 8 + }, +/obj/effect/spawner/random/medical/surgery_tool_advanced, +/turf/open/floor/iron/white, +/area/deathmatch) +"OL" = ( +/obj/vehicle/sealed/mecha/gygax, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/sand/plating, +/turf/open/floor/plating/airless, +/area/deathmatch) +"OQ" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 4 + }, +/obj/machinery/vending/wallmed/directional/north, +/mob/living/basic/bot/medbot/autopatrol, +/turf/open/floor/iron/white, +/area/deathmatch) +"OT" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/flora/bush/large/style_random, +/turf/open/floor/grass, +/area/deathmatch) +"PM" = ( +/obj/structure/girder/displaced, +/turf/open/misc/asteroid/airless, +/area/deathmatch) +"PR" = ( +/obj/structure/glowshroom/single, +/turf/open/misc/asteroid/airless, +/area/deathmatch) +"Qt" = ( +/turf/open/floor/iron/half{ + dir = 8 + }, +/area/deathmatch) +"QE" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/turf/open/space/basic, +/area/deathmatch) +"Rd" = ( +/obj/effect/turf_decal/tile/blue/half{ + dir = 1 + }, +/obj/structure/fluff/fake_camera{ + dir = 9 + }, +/obj/structure/sign/warning/no_smoking/circle/directional/north, +/turf/open/floor/iron/white, +/area/deathmatch) +"Rf" = ( +/obj/structure/fluff/tram_rail/floor, +/obj/item/stack/cable_coil, +/turf/open/floor/plating/airless, +/area/deathmatch) +"Rh" = ( +/turf/open/floor/iron/white, +/area/deathmatch) +"Rm" = ( +/obj/structure/sign/warning/directional/south, +/turf/open/space/basic, +/area/deathmatch) +"Rr" = ( +/obj/structure/railing/corner/end{ + dir = 8 + }, +/obj/effect/turf_decal/caution, +/obj/effect/turf_decal/arrows{ + dir = 1; + pixel_y = -12 + }, +/turf/open/floor/plating/airless, +/area/deathmatch) +"RG" = ( +/obj/machinery/porta_turret/syndicate{ + on = 0; + dir = 10 + }, +/turf/closed/wall/r_wall/syndicate, +/area/deathmatch) +"RU" = ( +/obj/machinery/door/airlock/survival_pod/glass{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/structure/fans/tiny, +/turf/open/floor/grass, +/area/deathmatch) +"RV" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/deathmatch) +"Sj" = ( +/obj/structure/railing/corner/end{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/item/storage/toolbox/electrical, +/turf/open/floor/plating/airless, +/area/deathmatch) +"So" = ( +/obj/item/bikehorn/airhorn, +/turf/open/space/basic, +/area/deathmatch) +"SJ" = ( +/obj/structure/fluff/tram_rail/anchor{ + dir = 1 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/deathmatch) +"SS" = ( +/obj/effect/turf_decal/sand/plating, +/obj/item/wirecutters, +/turf/open/floor/plating/airless, +/area/deathmatch) +"Tb" = ( +/obj/structure/railing/corner, +/obj/item/stock_parts/cell/high, +/turf/open/floor/plating/airless, +/area/deathmatch) +"Tq" = ( +/obj/effect/mob_spawn/corpse/human/roboticist, +/turf/open/misc/asteroid/airless, +/area/deathmatch) +"TP" = ( +/obj/effect/mob_spawn/corpse/human/skeleton, +/turf/open/misc/asteroid/airless, +/area/deathmatch) +"Uy" = ( +/obj/structure/lattice/catwalk, +/obj/item/stack/sheet/iron/twenty, +/turf/open/space/basic, +/area/deathmatch) +"Uz" = ( +/turf/open/floor/iron, +/area/deathmatch) +"Vf" = ( +/obj/structure/fluff/fake_camera{ + dir = 5 + }, +/turf/open/space/basic, +/area/deathmatch) +"Vm" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/item/statuebust/hippocratic{ + pixel_y = 13 + }, +/obj/machinery/light/floor, +/turf/open/floor/iron/white, +/area/deathmatch) +"Vn" = ( +/obj/structure/grille/broken, +/obj/item/flashlight/glowstick/red{ + start_on = 1 + }, +/turf/open/misc/asteroid/airless, +/area/deathmatch) +"Vo" = ( +/obj/item/storage/toolbox/guncase/nova/pistol/opfor/makarov, +/obj/structure/spacevine, +/obj/item/sign/flag/mothic{ + pixel_y = 5 + }, +/turf/open/floor/grass, +/area/deathmatch) +"Vz" = ( +/obj/structure/grille/broken, +/obj/effect/decal/cleanable/glass/titanium, +/obj/item/shard/titanium, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mineral/titanium/tiled/blue/airless, +/area/deathmatch) +"VN" = ( +/turf/open/floor/grass, +/area/deathmatch) +"Wc" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue, +/obj/item/reagent_containers/hypospray/medipen/deforest/aranepaine, +/obj/machinery/light/floor, +/turf/open/floor/iron/white, +/area/deathmatch) +"WA" = ( +/obj/structure/marker_beacon/burgundy, +/turf/open/misc/asteroid/airless, +/area/deathmatch) +"WG" = ( +/obj/effect/landmark/deathmatch_player_spawn, +/obj/structure/lattice, +/turf/open/space/basic, +/area/deathmatch) +"Xf" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/turf/open/floor/iron/white, +/area/deathmatch) +"Xr" = ( +/obj/effect/decal/cleanable/rubble, +/turf/closed/wall, +/area/deathmatch) +"Xs" = ( +/obj/structure/lattice/catwalk, +/obj/structure/reagent_dispensers/fueltank, +/turf/open/space/basic, +/area/deathmatch) +"XE" = ( +/obj/structure/ore_box, +/turf/open/misc/asteroid/airless, +/area/deathmatch) +"XI" = ( +/obj/structure/lattice/catwalk, +/obj/structure/marker_beacon/teal, +/turf/open/space/basic, +/area/deathmatch) +"XJ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/deathmatch) +"Yo" = ( +/obj/structure/fluff/tram_rail{ + dir = 1 + }, +/turf/open/space/basic, +/area/deathmatch) +"Yt" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/effect/light_emitter{ + set_cap = 2; + light_color = "#DEEFFF"; + set_luminosity = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/grimy, +/area/deathmatch) +"YJ" = ( +/obj/item/pickaxe/mini, +/turf/open/misc/asteroid/airless, +/area/deathmatch) +"YK" = ( +/obj/machinery/door/airlock/external, +/obj/structure/fans/tiny, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/iron/white/small, +/area/deathmatch) +"YX" = ( +/obj/effect/turf_decal/delivery, +/obj/item/stock_parts/cell/high, +/turf/open/floor/plating/airless, +/area/deathmatch) +"Zf" = ( +/obj/machinery/door/airlock/external, +/obj/structure/fans/tiny, +/turf/open/floor/mineral/plastitanium, +/area/deathmatch) +"Zw" = ( +/obj/structure/lattice/catwalk, +/obj/item/clothing/glasses/welding/up, +/turf/open/space/basic, +/area/deathmatch) +"ZJ" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/deathmatch) +"ZK" = ( +/turf/open/misc/asteroid/airless, +/area/deathmatch) +"ZS" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/barricade/wooden, +/turf/open/floor/plating/airless, +/area/deathmatch) +"ZU" = ( +/obj/machinery/power/shuttle_engine/propulsion/right{ + dir = 8 + }, +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/deathmatch) +"ZW" = ( +/obj/machinery/light/directional/south, +/obj/machinery/porta_turret/dm, +/turf/open/floor/iron, +/area/deathmatch) + +(1,1,1) = {" +qw +qw +qw +qw +qw +qw +qw +qw +qw +qw +qw +qw +qw +qw +qw +ZK +aH +ZK +zJ +ZK +ll +ll +ll +ll +ll +ll +ll +Eb +Eb +Eb +Eb +fL +Eb +Eb +yL +Eb +mL +Eb +Eb +Eb +"} +(2,1,1) = {" +qw +qw +qw +qw +qw +qw +Kh +LV +qw +qw +qw +qw +qw +qw +dH +KK +NK +Jv +fH +Jv +vJ +AY +ys +cF +NP +ne +Xs +Eb +gf +Eb +lF +Hc +Jb +LO +xL +yu +yu +EJ +DD +Eb +"} +(3,1,1) = {" +qw +jb +qw +qw +VN +zj +xM +VN +oi +VN +IC +VN +ni +sT +bL +KJ +Rf +YX +CA +mO +Rr +rb +Uy +ys +qv +qi +ys +nc +ip +Bx +iV +gP +LO +Fy +xa +hM +oU +qK +IT +Eb +"} +(4,1,1) = {" +qw +qw +qw +LV +VN +bW +Hg +IG +xM +VN +qw +qw +qw +dH +ZS +hu +aF +CT +vY +yl +Bc +Tb +pk +lH +HS +ys +ny +Eb +mi +Eb +mi +mi +mi +Eb +Eb +Dy +Yt +uI +yt +Eb +"} +(5,1,1) = {" +qw +qw +pP +VN +Kh +oi +VN +VN +bW +VN +zj +qw +qw +qw +dH +Ix +pK +RV +gC +RV +li +fd +rC +rC +rC +rj +DP +RV +RV +RV +RV +RV +RV +RV +mi +hJ +jY +Hv +xp +Eb +"} +(6,1,1) = {" +qw +qw +bW +xM +zj +Vo +yb +zj +LV +IX +pP +qw +qw +qw +dh +wf +El +wf +Yo +wf +Ny +Eu +wf +rC +vs +rC +wf +wf +wf +wf +wf +wf +wf +RV +mi +mi +Eb +uv +yu +Eb +"} +(7,1,1) = {" +qw +qw +FZ +zj +oi +pP +zj +xM +VN +qw +qw +qw +qw +wf +wf +wf +El +wf +Yo +wf +wf +wf +wf +wf +rC +wf +wf +wf +wf +wf +wf +BX +wf +bP +RV +RV +Eb +oZ +Km +yN +"} +(8,1,1) = {" +qw +qw +xM +bW +VN +VN +bW +oi +qw +qw +qw +qw +wf +wf +wf +wf +El +wf +Yo +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +RV +mi +IY +uX +Eb +"} +(9,1,1) = {" +qw +qw +qw +oi +xM +LV +xM +qw +qw +qw +ZK +Mw +wf +wf +wf +vy +El +wf +Yo +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +RV +mi +LO +vz +yN +"} +(10,1,1) = {" +qw +qw +qw +RU +qw +qw +qw +qw +qw +FP +ZK +ZK +Mw +wf +wf +wf +El +wf +Yo +wf +wf +yg +Ov +yg +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +RV +mi +iV +sW +Eb +"} +(11,1,1) = {" +qw +qw +qw +VN +qw +gd +qw +qw +qw +ZK +HA +qw +qw +qw +wf +wf +El +wf +Yo +wf +wf +zE +eb +RG +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +RV +Eb +FN +Eb +Eb +"} +(12,1,1) = {" +qw +qw +qw +xB +qw +qw +dH +og +IU +eB +ZU +qw +qw +wf +wf +wf +El +wf +Yo +aG +yg +yg +Mh +yg +yg +nJ +wf +wf +wf +wf +wf +wf +wf +wf +wf +RV +mi +ip +Bz +Eb +"} +(13,1,1) = {" +dH +za +qw +Mw +qw +HA +hk +ZK +Vn +lf +PM +ZK +Mw +wf +wf +wf +El +wf +Yo +wf +cT +yg +Zf +yg +cT +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +RV +Eb +oO +Eb +Eb +"} +(14,1,1) = {" +MS +ZK +ZK +Gr +ZK +ZK +ZK +ZK +TP +rG +qg +ZK +Mw +wf +wf +wf +El +wf +Yo +wf +HI +cT +ys +cT +HI +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +AD +ys +Xs +ll +"} +(15,1,1) = {" +wf +YJ +wf +wf +wf +wf +wf +Gr +PM +Vz +og +cX +qw +qw +wf +wf +El +wf +Yo +wf +wf +HI +wf +HI +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +uA +ys +ne +ll +"} +(16,1,1) = {" +wf +wf +wf +wf +wf +wf +wf +wf +ZK +ZK +ZK +qw +qw +qw +dH +KJ +pf +CT +AM +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +KJ +DW +zB +ll +"} +(17,1,1) = {" +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +ZK +qw +qw +qw +dH +KJ +pf +Jn +AM +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +Di +Lw +Zw +ll +"} +(18,1,1) = {" +zC +KQ +zC +wf +zC +KQ +zC +wf +wf +wf +wf +HA +qw +qw +wf +wf +El +wf +Yo +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +AD +ys +Iv +ll +"} +(19,1,1) = {" +RV +wf +RV +wf +WG +wf +RV +wf +wf +wf +wf +wf +wf +wf +wf +wf +El +wf +Yo +RV +wf +wf +wf +wf +wf +wf +wf +bP +RV +lV +lV +lV +yw +RV +RV +RV +Sj +aq +eE +ll +"} +(20,1,1) = {" +RV +wu +RV +wu +RV +wu +RV +wf +wf +wf +wf +wf +wf +wf +wf +wf +El +RV +jS +jS +wf +wf +wf +wf +wf +wf +wf +wf +fG +KJ +Nc +KJ +KJ +wf +wf +wf +xJ +nu +SS +ll +"} +(21,1,1) = {" +RV +wu +RV +wu +RV +wu +RV +wf +wf +wf +wf +wf +wf +wf +wf +wf +El +HK +fs +og +CE +wf +wf +wf +wf +wf +wf +wf +RV +KJ +KJ +KJ +KJ +wf +wf +wf +fP +KJ +Jv +ll +"} +(22,1,1) = {" +QE +QE +QE +QE +QE +QE +EI +lZ +wf +wf +wf +wf +wf +wf +wf +wf +nW +lv +og +nW +wf +wf +wf +wf +wf +wf +wf +bP +RV +XJ +XJ +XJ +XJ +RV +RV +RV +px +Jv +ll +ll +"} +(23,1,1) = {" +RV +wu +wf +wu +RV +wu +RV +wf +wf +wf +wf +wf +wf +wf +wf +wf +yB +ZJ +yB +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +Rm +Xr +ll +ll +"} +(24,1,1) = {" +RV +wu +wf +wu +RV +wu +RV +wf +wf +wf +wf +wf +wf +wf +Vf +qg +qg +lv +qg +qg +CW +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +Gr +ll +ll +"} +(25,1,1) = {" +RV +wf +wf +wf +RV +wf +RV +wf +wf +wf +wf +wf +wf +wf +wf +qg +vh +Uz +IK +qg +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +OC +rN +wf +wf +ZK +Ic +ll +"} +(26,1,1) = {" +zC +KQ +zC +wf +zC +KQ +zC +wf +wf +wf +wf +wf +wf +wf +wf +tc +rg +Qt +Gq +tc +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +rN +rN +rN +wf +FP +Ko +ll +"} +(27,1,1) = {" +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +tc +mq +CV +mq +tc +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +rN +rN +rN +wf +wf +ZK +ll +"} +(28,1,1) = {" +wf +wf +wf +wf +So +wf +wf +wf +rN +Ki +EB +wf +wf +wf +wf +tc +nE +Qt +bN +tc +wf +wf +wf +yg +Ov +yg +wf +wf +wf +wf +rN +HA +wf +XE +rN +wf +wf +wf +ZK +ll +"} +(29,1,1) = {" +wf +wf +wf +ah +NF +wf +lE +rN +rN +Od +vn +ys +wf +wf +wf +qg +CP +Uz +ZW +qg +wf +wf +wf +zE +eb +RG +wf +wf +wf +rN +lL +rN +wf +wf +wf +wf +wf +wf +wf +ll +"} +(30,1,1) = {" +wf +wf +wf +wf +wL +wf +wf +rN +rN +ZK +ZK +Iv +wf +wf +FT +qg +qg +vB +qg +qg +CE +aG +yg +yg +HH +yg +yg +nJ +wf +rN +oJ +rN +wf +wf +wf +wf +wf +wf +ZK +rN +"} +(31,1,1) = {" +wf +YK +wf +wf +wf +CY +wf +wf +rN +ZK +ZK +sy +wf +wf +wf +wf +yB +ip +yB +wf +wf +wf +cT +yg +Zf +yg +cT +wf +wf +Gr +rN +wf +wf +rN +cX +wf +wf +ZK +HA +rN +"} +(32,1,1) = {" +RV +Ai +RV +RV +wf +wf +wf +wf +rN +rN +WA +ys +wf +wf +Vf +qg +og +vB +qg +nW +wf +wf +HI +cT +ys +cT +HI +wf +wf +wf +wf +wf +rN +rN +rN +wf +wf +XE +rN +rN +"} +(33,1,1) = {" +Eb +gK +mi +mi +XI +wf +wf +wf +wf +rN +Gr +wf +wf +wf +wf +og +is +Kf +yf +nW +wf +wf +wf +HI +wf +HI +wf +wf +wf +wf +wf +wf +rN +rN +rN +wf +cW +dH +rN +rN +"} +(34,1,1) = {" +Eb +em +ve +OT +mi +RV +wf +wf +wf +wf +wf +wf +wf +wf +wf +Bh +kK +jS +KJ +Bh +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +wf +rN +wf +wf +GM +KN +Gr +rN +"} +(35,1,1) = {" +mL +Rh +Vm +OG +mi +RV +wf +wf +wf +wf +wf +wf +wf +wf +wf +KJ +jS +nQ +RV +jS +wf +wf +wf +ZK +wf +wf +ZK +HA +wf +tA +wf +wf +wf +wf +wf +wf +cW +dH +PR +rN +"} +(36,1,1) = {" +Eb +AJ +NS +Rh +Fp +Xf +Xf +FS +wf +wf +wf +wf +wf +wf +wf +jS +RV +jS +Yo +wf +wf +HA +wf +wf +wf +Tq +qw +qw +FP +Ar +GM +wf +wf +wf +wf +ZK +rN +rN +ZK +rN +"} +(37,1,1) = {" +Eb +Rd +zk +yP +zY +dx +dx +FS +wf +nK +wf +wf +wf +wf +wf +nW +Gu +wf +Yo +wf +wf +wf +wf +HZ +qw +qw +qw +qw +qw +ep +lb +GM +wf +wf +YJ +rN +rN +kO +wi +rN +"} +(38,1,1) = {" +mL +kX +Wc +hH +mi +RV +wf +wf +wf +wf +wf +wf +wf +BX +wf +RV +El +wf +Yo +wf +wf +YJ +cb +dH +qw +qw +qw +qw +qw +dH +ry +ir +wf +wf +ZK +rN +rN +HA +el +rN +"} +(39,1,1) = {" +Eb +OQ +Gl +Dn +mi +RV +wf +wf +ZK +rN +FP +ZK +wf +wf +wf +wf +wd +CT +SJ +KJ +dH +qw +qw +qw +qw +qw +OL +fF +qw +qw +qw +yO +wf +wf +HA +rN +rN +rN +rN +rN +"} +(40,1,1) = {" +Eb +vu +Iw +Iw +XI +wf +wf +cX +rN +rN +rN +rN +Gr +wf +wf +wf +wd +CT +SJ +KJ +dH +qw +qw +qw +qw +qw +qw +qw +qw +qw +qw +qw +wf +wf +rN +rN +rN +rN +rN +rN +"} diff --git a/_maps/virtual_domains/pirates.dmm b/_maps/virtual_domains/pirates.dmm index 18fd11f477a..0bc71f43f6a 100644 --- a/_maps/virtual_domains/pirates.dmm +++ b/_maps/virtual_domains/pirates.dmm @@ -1,8 +1,4 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"af" = ( -/obj/structure/flora/rock/pile/style_2, -/turf/open/water/beach, -/area/virtual_domain/fullbright) "al" = ( /obj/structure/flora/bush/sunny, /turf/open/misc/grass, @@ -16,39 +12,20 @@ dir = 10 }, /area/virtual_domain/fullbright) -"be" = ( -/obj/effect/turf_decal/weather/dirt, -/obj/structure/flora/rock/pile, +"br" = ( +/obj/structure/flora/grass/jungle/b, +/turf/open/misc/dirt/jungle, +/area/virtual_domain/protected_space) +"ce" = ( +/obj/structure/flora/rock/pile/style_2, /turf/open/water/beach, -/area/virtual_domain/fullbright) -"bI" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 +/area/virtual_domain/protected_space/fullbright) +"cT" = ( +/obj/item/gun/energy/laser/hellgun{ + pixel_y = 10 }, -/obj/structure/table/wood, -/obj/item/gun/energy/laser/musket{ - pixel_y = 7 - }, -/obj/item/gun/energy/laser/musket{ - pixel_y = 2 - }, -/obj/item/gun/energy/laser/musket{ - pixel_y = -3 - }, -/turf/open/floor/wood, -/area/virtual_domain/fullbright) -"cr" = ( -/obj/item/stack/cannonball/shellball{ - pixel_x = 13; - pixel_y = 11 - }, -/obj/item/stack/cannonball{ - pixel_x = 9; - pixel_y = 9 - }, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/wood, -/area/virtual_domain/fullbright) +/turf/open/misc/dirt/jungle, +/area/virtual_domain/protected_space) "cX" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/item/claymore/cutlass, @@ -64,16 +41,38 @@ icon_state = "wood_large" }, /area/virtual_domain/fullbright) -"db" = ( -/obj/effect/turf_decal/weather/dirt{ - dir = 1 - }, -/obj/effect/turf_decal/weather/dirt, -/turf/open/water/beach, -/area/virtual_domain/fullbright) "dc" = ( /turf/open/misc/beach/coast/corner, /area/virtual_domain/fullbright) +"dp" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/wood, +/area/virtual_domain/protected_space/fullbright) +"dz" = ( +/obj/structure/flora/rock/pile/jungle/large, +/turf/open/misc/dirt/jungle, +/area/virtual_domain/protected_space) +"dL" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/table/wood, +/obj/item/flashlight/flare/torch{ + pixel_y = 10; + pixel_x = 7 + }, +/obj/item/reagent_containers/cup/bucket/wooden{ + pixel_y = -16; + pixel_x = 12 + }, +/obj/machinery/recharger{ + pixel_y = 6; + pixel_x = -5 + }, +/turf/open/floor/wood, +/area/virtual_domain/protected_space/fullbright) "dN" = ( /obj/machinery/door/airlock/vault{ color = "#825427"; @@ -81,25 +80,9 @@ }, /turf/open/floor/wood/parquet, /area/virtual_domain) -"eO" = ( -/obj/structure/flora/rock/pile, -/turf/open/water/beach, -/area/virtual_domain/fullbright) -"eP" = ( -/obj/effect/turf_decal/weather/dirt{ - dir = 4 - }, -/turf/open/misc/beach/coast{ - dir = 6 - }, -/area/virtual_domain/fullbright) "eS" = ( /turf/open/misc/beach/sand, /area/virtual_domain/fullbright) -"fd" = ( -/obj/structure/flora/grass/jungle/b, -/turf/open/misc/dirt/jungle, -/area/virtual_domain/fullbright) "fh" = ( /obj/structure/flora/bush/sparsegrass, /obj/structure/flora/bush/lavendergrass, @@ -109,11 +92,6 @@ /obj/structure/flora/bush/sparsegrass/style_random, /turf/open/misc/grass, /area/virtual_domain/fullbright) -"fw" = ( -/obj/effect/turf_decal/siding/wood, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/wood, -/area/virtual_domain/fullbright) "fR" = ( /obj/effect/baseturf_helper/virtual_domain, /turf/closed/indestructible/binary, @@ -148,20 +126,28 @@ /obj/structure/flora/bush/ferny, /turf/open/misc/grass, /area/virtual_domain/fullbright) +"gN" = ( +/obj/structure/fermenting_barrel/gunpowder{ + pixel_x = -4; + pixel_y = 17 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/virtual_domain/protected_space/fullbright) "hb" = ( /turf/closed/indestructible/binary, /area/virtual_domain/fullbright) -"hn" = ( -/obj/effect/turf_decal/weather/dirt{ - dir = 4 - }, +"hp" = ( +/obj/effect/turf_decal/weather/dirt, /turf/open/water/beach, -/area/virtual_domain/fullbright) -"hq" = ( -/obj/structure/closet/crate/grave, -/obj/structure/flora/grass/jungle/b, -/turf/open/misc/dirt/jungle, -/area/virtual_domain/fullbright) +/area/virtual_domain/protected_space) +"hx" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/obj/effect/turf_decal/weather/dirt, +/turf/open/water/beach, +/area/virtual_domain/protected_space) "jp" = ( /obj/effect/landmark/bitrunning/cache_spawn, /turf/open/misc/beach/sand, @@ -178,6 +164,25 @@ /obj/structure/flora/bush/fullgrass/style_random, /turf/open/misc/grass, /area/virtual_domain/fullbright) +"ki" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/water/beach, +/area/virtual_domain/protected_space) +"kl" = ( +/obj/structure/flora/bush/sunny/style_3{ + pixel_y = 22 + }, +/turf/open/misc/dirt/jungle, +/area/virtual_domain/protected_space) +"kE" = ( +/obj/structure/flora/grass/jungle/b/style_random{ + pixel_x = -13; + pixel_y = 18 + }, +/turf/open/misc/dirt/jungle, +/area/virtual_domain/protected_space) "lF" = ( /obj/structure/table/wood, /obj/item/melee/energy/sword/pirate{ @@ -208,6 +213,10 @@ /obj/effect/decal/cleanable/oil/streak, /turf/open/floor/wood, /area/virtual_domain/fullbright) +"lM" = ( +/obj/structure/flora/rock/pile/style_3, +/turf/open/misc/dirt/jungle, +/area/virtual_domain/protected_space) "mp" = ( /turf/open/misc/beach/coast{ dir = 4 @@ -217,42 +226,20 @@ /obj/machinery/smartfridge/drying_rack, /turf/open/misc/beach/sand, /area/virtual_domain/fullbright) -"nb" = ( -/obj/effect/turf_decal/weather/sand{ - dir = 9 - }, -/obj/structure/fermenting_barrel{ - pixel_x = 6; - pixel_y = 11 - }, -/obj/effect/mob_spawn/ghost_role/human/pirate/skeleton, -/turf/open/floor/wood{ - icon_state = "wood_large" - }, -/area/virtual_domain/fullbright) +"na" = ( +/obj/effect/turf_decal/weather/dirt, +/obj/structure/flora/rock/pile, +/turf/open/water/beach, +/area/virtual_domain/protected_space) "nr" = ( /mob/living/basic/trooper/pirate/melee, /turf/open/misc/beach/sand, /area/virtual_domain/fullbright) -"nN" = ( -/obj/structure/flora/rock, -/turf/open/water/beach, -/area/virtual_domain/fullbright) -"oB" = ( -/obj/structure/flora/grass/jungle, -/turf/open/misc/dirt/jungle, -/area/virtual_domain/fullbright) "oL" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/bed/maint, /turf/open/floor/wood, /area/virtual_domain/fullbright) -"oM" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/wood, -/area/virtual_domain/fullbright) "pi" = ( /obj/structure/flora/rock/style_3, /turf/open/water/beach, @@ -261,18 +248,24 @@ /obj/structure/flora/bush/flowers_br/style_random, /turf/open/misc/grass, /area/virtual_domain/fullbright) -"qk" = ( -/turf/open/misc/dirt/jungle, -/area/virtual_domain/fullbright) "qE" = ( /obj/structure/table/wood, /obj/item/book/manual/wiki/ordnance, /turf/open/floor/carpet/blue, /area/virtual_domain) +"qR" = ( +/turf/open/misc/dirt/jungle, +/area/virtual_domain/protected_space) "qS" = ( /obj/effect/decal/cleanable/ants, /turf/open/misc/grass, /area/virtual_domain/fullbright) +"qT" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/water/beach, +/area/virtual_domain/protected_space) "ri" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -281,29 +274,6 @@ /mob/living/basic/trooper/pirate/ranged/space, /turf/open/floor/carpet/blue, /area/virtual_domain) -"rm" = ( -/obj/structure/closet/crate/goldcrate, -/turf/open/misc/dirt/jungle, -/area/virtual_domain/fullbright) -"rn" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/structure/table/wood, -/obj/item/flashlight/flare/torch{ - pixel_y = 10; - pixel_x = 7 - }, -/obj/item/reagent_containers/cup/bucket/wooden{ - pixel_y = -16; - pixel_x = 12 - }, -/obj/machinery/recharger{ - pixel_y = 6; - pixel_x = -5 - }, -/turf/open/floor/wood, -/area/virtual_domain/fullbright) "ru" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/dirt/dust, @@ -319,6 +289,12 @@ /obj/effect/mine/explosive/light, /turf/open/misc/beach/sand, /area/virtual_domain/fullbright) +"sH" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/virtual_domain/protected_space/fullbright) "td" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/landmark/bitrunning/cache_spawn, @@ -345,6 +321,10 @@ icon_state = "wood_large" }, /area/virtual_domain/fullbright) +"tR" = ( +/obj/effect/landmark/bitrunning/cache_spawn, +/turf/open/misc/dirt/jungle, +/area/virtual_domain/protected_space) "ub" = ( /turf/template_noop, /area/virtual_domain/safehouse) @@ -377,12 +357,33 @@ icon_state = "wood_large" }, /area/virtual_domain/fullbright) -"vR" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 10 - }, +"uS" = ( /turf/open/floor/wood, -/area/virtual_domain/fullbright) +/area/virtual_domain/protected_space/fullbright) +"vo" = ( +/obj/structure/closet/crate/grave, +/obj/structure/flora/grass/jungle/b, +/turf/open/misc/dirt/jungle, +/area/virtual_domain/protected_space) +"vX" = ( +/obj/item/stack/cannonball/shellball{ + pixel_x = 13; + pixel_y = 11 + }, +/obj/item/stack/cannonball{ + pixel_x = 9; + pixel_y = 9 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/virtual_domain/protected_space/fullbright) +"wf" = ( +/obj/structure/flora/rock/pile/jungle/style_3{ + pixel_x = -15; + pixel_y = -4 + }, +/turf/open/misc/dirt/jungle, +/area/virtual_domain/protected_space) "wj" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -391,17 +392,22 @@ /obj/effect/decal/cleanable/oil, /turf/open/floor/wood, /area/virtual_domain/fullbright) -"wu" = ( -/obj/structure/flora/grass/jungle/b{ - pixel_x = -15; - pixel_y = 9 +"wn" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, -/obj/structure/flora/rock/pile/jungle/large/style_2{ - pixel_x = -3; - pixel_y = -1 +/obj/structure/table/wood, +/obj/item/gun/energy/laser/musket{ + pixel_y = 7 }, -/turf/open/misc/dirt/jungle, -/area/virtual_domain/fullbright) +/obj/item/gun/energy/laser/musket{ + pixel_y = 2 + }, +/obj/item/gun/energy/laser/musket{ + pixel_y = -3 + }, +/turf/open/floor/wood, +/area/virtual_domain/protected_space/fullbright) "wH" = ( /obj/structure/fluff/beach_umbrella{ pixel_x = -7; @@ -425,27 +431,16 @@ "xp" = ( /turf/open/water/beach, /area/virtual_domain/fullbright) -"zc" = ( -/obj/item/gun/energy/laser/hellgun{ - pixel_y = 10 - }, -/turf/open/misc/dirt/jungle, -/area/virtual_domain/fullbright) "zj" = ( /obj/effect/mapping_helpers/burnt_floor, /obj/effect/decal/cleanable/garbage, /turf/open/floor/wood, /area/virtual_domain/fullbright) -"zk" = ( +"zA" = ( /obj/effect/turf_decal/siding/wood, -/obj/item/melee/sabre{ - pixel_y = 12; - pixel_x = -10 - }, -/obj/item/gun/energy/laser/retro, -/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, -/area/virtual_domain/fullbright) +/area/virtual_domain/protected_space/fullbright) "zR" = ( /obj/effect/baseturf_helper/virtual_domain, /turf/template_noop, @@ -472,6 +467,14 @@ }, /turf/open/misc/beach/coast, /area/virtual_domain/fullbright) +"AF" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/item/storage/bag/money/dutchmen{ + pixel_y = 13 + }, +/obj/structure/rack/skeletal, +/turf/open/floor/wood/parquet, +/area/virtual_domain) "AP" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/wood/parquet, @@ -495,15 +498,22 @@ /obj/structure/bonfire/prelit, /turf/open/misc/beach/sand, /area/virtual_domain/fullbright) -"BX" = ( -/obj/structure/flora/bush/sunny/style_3{ - pixel_y = 22 - }, -/turf/open/misc/dirt/jungle, -/area/virtual_domain/fullbright) "Ci" = ( /turf/closed/wall/mineral/wood/nonmetal, /area/virtual_domain/fullbright) +"Cq" = ( +/obj/structure/fermenting_barrel{ + pixel_x = 6; + pixel_y = 11 + }, +/obj/effect/turf_decal/weather/sand{ + dir = 9 + }, +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/pirate, +/turf/open/floor/wood{ + icon_state = "wood_large" + }, +/area/virtual_domain/fullbright) "Cu" = ( /obj/item/kirbyplants/organic/plant21{ pixel_x = -8 @@ -513,18 +523,40 @@ }, /turf/open/floor/wood/parquet, /area/virtual_domain) -"CL" = ( -/obj/structure/flora/rock/pile/jungle/large, -/turf/open/misc/dirt/jungle, -/area/virtual_domain/fullbright) -"Dd" = ( -/obj/effect/turf_decal/siding/wood, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/virtual_domain/fullbright) "DM" = ( /turf/closed/mineral/random/jungle, /area/virtual_domain/fullbright) +"DT" = ( +/obj/item/clothing/suit/armor/militia{ + pixel_x = -5; + pixel_y = 12 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/item/clothing/suit/armor/militia{ + pixel_x = -5; + pixel_y = 6 + }, +/obj/item/clothing/suit/armor/militia{ + pixel_x = -5; + pixel_y = -3 + }, +/obj/item/clothing/head/costume/fancy{ + pixel_x = 6; + pixel_y = 12 + }, +/obj/item/clothing/head/costume/fancy{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/item/clothing/head/hats/coordinator{ + pixel_x = 8; + pixel_y = -5 + }, +/obj/structure/closet/cabinet, +/turf/open/floor/wood, +/area/virtual_domain/protected_space/fullbright) "Eb" = ( /obj/structure/flora/tree/palm, /turf/open/misc/beach/sand, @@ -556,14 +588,14 @@ icon_state = "wood_large" }, /area/virtual_domain/fullbright) -"Gl" = ( -/obj/structure/flora/rock/pile/style_3, -/turf/open/misc/dirt/jungle, -/area/virtual_domain/fullbright) "Gy" = ( /obj/structure/flora/rock/style_2, /turf/open/water/beach, /area/virtual_domain/fullbright) +"GM" = ( +/obj/structure/flora/rock/pile/jungle/style_2, +/turf/open/misc/dirt/jungle, +/area/virtual_domain/protected_space) "Hn" = ( /obj/effect/baseturf_helper/virtual_domain, /turf/closed/wall/mineral/wood/nonmetal, @@ -575,16 +607,17 @@ }, /turf/open/floor/carpet/blue, /area/virtual_domain) -"ID" = ( -/obj/effect/landmark/bitrunning/cache_spawn, -/turf/open/misc/dirt/jungle, -/area/virtual_domain/fullbright) -"IW" = ( +"Ic" = ( /obj/effect/turf_decal/weather/dirt{ dir = 5 }, /turf/open/water/beach, -/area/virtual_domain/fullbright) +/area/virtual_domain/protected_space) +"In" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/virtual_domain/protected_space/fullbright) "Jf" = ( /obj/structure/flora/bush/sparsegrass, /turf/open/misc/grass, @@ -603,6 +636,10 @@ /obj/structure/bed/double, /turf/open/floor/carpet/blue, /area/virtual_domain) +"JF" = ( +/obj/structure/flora/rock, +/turf/open/water/beach, +/area/virtual_domain/protected_space/fullbright) "JK" = ( /obj/structure/flora/bush/stalky{ pixel_y = 13; @@ -615,6 +652,10 @@ dir = 1 }, /area/virtual_domain/fullbright) +"Ka" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/virtual_domain/protected_space/fullbright) "KS" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -623,31 +664,26 @@ /obj/effect/landmark/bitrunning/cache_spawn, /turf/open/floor/carpet/blue, /area/virtual_domain) -"KV" = ( -/obj/structure/flora/rock/pile/jungle/style_3{ - pixel_x = -15; - pixel_y = -4 - }, +"KW" = ( +/obj/structure/flora/grass/jungle, /turf/open/misc/dirt/jungle, -/area/virtual_domain/fullbright) +/area/virtual_domain/protected_space) "LC" = ( /mob/living/basic/trooper/pirate/melee, /turf/open/misc/grass, /area/virtual_domain/fullbright) -"LK" = ( -/obj/structure/fermenting_barrel/gunpowder{ - pixel_x = -4; - pixel_y = 17 - }, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/wood, -/area/virtual_domain/fullbright) "LP" = ( /obj/effect/turf_decal/weather/sand{ dir = 5 }, /turf/open/floor/wood, /area/virtual_domain/fullbright) +"LX" = ( +/turf/closed/wall/mineral/wood/nonmetal, +/area/virtual_domain/protected_space/fullbright) +"Mc" = ( +/turf/closed/indestructible/binary, +/area/virtual_domain/protected_space/fullbright) "Mf" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/wood{ @@ -658,12 +694,24 @@ /obj/structure/barricade/sandbags, /turf/open/misc/beach/sand, /area/virtual_domain/fullbright) +"MJ" = ( +/obj/structure/closet/crate/goldcrate, +/turf/open/misc/dirt/jungle, +/area/virtual_domain/protected_space) +"MO" = ( +/obj/effect/turf_decal/weather/dirt, +/obj/effect/turf_decal/weather/dirt, +/turf/open/water/beach, +/area/virtual_domain/protected_space) "MP" = ( /obj/effect/turf_decal/weather/sand{ dir = 4 }, /turf/open/floor/wood, /area/virtual_domain/fullbright) +"Nx" = ( +/turf/open/water/beach, +/area/virtual_domain/protected_space) "NE" = ( /obj/effect/mob_spawn/corpse/human/damaged, /turf/open/water/beach, @@ -680,17 +728,6 @@ icon_state = "wood_large" }, /area/virtual_domain/fullbright) -"NU" = ( -/obj/structure/flora/grass/jungle/b/style_random{ - pixel_x = -13; - pixel_y = 18 - }, -/turf/open/misc/dirt/jungle, -/area/virtual_domain/fullbright) -"Oi" = ( -/obj/effect/mob_spawn/corpse/human/pirate, -/turf/open/misc/dirt/jungle, -/area/virtual_domain/fullbright) "Ov" = ( /turf/open/misc/beach/coast{ dir = 6 @@ -703,37 +740,37 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/carpet/blue, /area/virtual_domain) -"Oz" = ( -/obj/structure/flora/rock/pile/jungle/style_2, +"OB" = ( +/obj/structure/flora/grass/jungle/b{ + pixel_x = -15; + pixel_y = 9 + }, +/obj/structure/flora/rock/pile/jungle/large/style_2{ + pixel_x = -3; + pixel_y = -1 + }, /turf/open/misc/dirt/jungle, -/area/virtual_domain/fullbright) +/area/virtual_domain/protected_space) "OD" = ( /obj/effect/turf_decal/weather/sand{ dir = 6 }, /turf/open/floor/wood, /area/virtual_domain/fullbright) -"OW" = ( -/obj/effect/turf_decal/weather/dirt{ - dir = 1 - }, -/turf/open/water/beach, -/area/virtual_domain/fullbright) +"OE" = ( +/obj/effect/mob_spawn/corpse/human/pirate, +/turf/open/misc/dirt/jungle, +/area/virtual_domain/protected_space) "Qc" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood{ icon_state = "wood_large" }, /area/virtual_domain/fullbright) -"QF" = ( -/obj/effect/turf_decal/weather/dirt, +"QJ" = ( +/obj/structure/flora/rock/pile, /turf/open/water/beach, -/area/virtual_domain/fullbright) -"QG" = ( -/obj/effect/turf_decal/weather/dirt, -/obj/effect/turf_decal/weather/dirt, -/turf/open/water/beach, -/area/virtual_domain/fullbright) +/area/virtual_domain/protected_space/fullbright) "QN" = ( /obj/structure/barricade/sandbags, /obj/effect/turf_decal/weather/sand{ @@ -751,37 +788,14 @@ /obj/effect/mob_spawn/corpse/human/pirate/melee, /turf/open/water/beach, /area/virtual_domain/fullbright) -"QX" = ( -/obj/item/clothing/suit/armor/militia{ - pixel_x = -5; - pixel_y = 12 +"RC" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 4 }, -/obj/effect/turf_decal/siding/wood{ - dir = 1 +/turf/open/misc/beach/coast{ + dir = 6 }, -/obj/item/clothing/suit/armor/militia{ - pixel_x = -5; - pixel_y = 6 - }, -/obj/item/clothing/suit/armor/militia{ - pixel_x = -5; - pixel_y = -3 - }, -/obj/item/clothing/head/costume/fancy{ - pixel_x = 6; - pixel_y = 12 - }, -/obj/item/clothing/head/costume/fancy{ - pixel_x = 6; - pixel_y = 6 - }, -/obj/item/clothing/head/hats/coordinator{ - pixel_x = 8; - pixel_y = -5 - }, -/obj/structure/closet/cabinet, -/turf/open/floor/wood, -/area/virtual_domain/fullbright) +/area/virtual_domain/protected_space) "RJ" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -813,6 +827,9 @@ }, /turf/open/floor/wood, /area/virtual_domain/fullbright) +"SE" = ( +/turf/open/water/beach, +/area/virtual_domain/protected_space/fullbright) "SK" = ( /turf/open/misc/beach/coast, /area/virtual_domain/fullbright) @@ -826,6 +843,16 @@ }, /turf/open/floor/wood, /area/virtual_domain/fullbright) +"SZ" = ( +/obj/effect/turf_decal/siding/wood, +/obj/item/melee/sabre{ + pixel_y = 12; + pixel_x = -10 + }, +/obj/item/gun/energy/laser/retro, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/virtual_domain/protected_space/fullbright) "Ta" = ( /obj/structure/flora/bush/flowers_pp, /turf/open/misc/grass, @@ -842,26 +869,17 @@ /obj/structure/bookcase/random/fiction, /turf/open/floor/wood/parquet, /area/virtual_domain) +"TT" = ( +/obj/structure/flora/rock/style_3, +/turf/open/water/beach, +/area/virtual_domain/protected_space/fullbright) "Ul" = ( /turf/closed/wall/mineral/wood/nonmetal, /area/virtual_domain) -"Uw" = ( -/obj/structure/cannon{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/wood, -/area/virtual_domain/fullbright) "Vx" = ( /obj/structure/flora/rock/style_4, /turf/open/water/beach, /area/virtual_domain/fullbright) -"VE" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/wood, -/area/virtual_domain/fullbright) "VG" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -869,6 +887,9 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/carpet/blue, /area/virtual_domain) +"VP" = ( +/turf/closed/mineral/random/jungle, +/area/virtual_domain/protected_space/fullbright) "Wu" = ( /obj/structure/fermenting_barrel/gunpowder{ pixel_x = -4; @@ -890,10 +911,6 @@ }, /turf/open/misc/beach/sand, /area/virtual_domain/fullbright) -"Wx" = ( -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/wood, -/area/virtual_domain/fullbright) "WW" = ( /turf/template_noop, /area/virtual_domain/fullbright) @@ -907,6 +924,15 @@ /obj/structure/barricade/wooden/crude, /turf/closed/wall/mineral/wood/nonmetal, /area/virtual_domain/fullbright) +"XR" = ( +/obj/structure/cannon{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/virtual_domain/protected_space/fullbright) "XW" = ( /obj/effect/mob_spawn/corpse/human/pirate, /turf/open/misc/beach/coast{ @@ -922,9 +948,6 @@ /obj/effect/decal/cleanable/blood/gibs/old, /turf/open/misc/beach/sand, /area/virtual_domain/fullbright) -"Yy" = ( -/turf/open/floor/wood, -/area/virtual_domain/fullbright) "YJ" = ( /obj/structure/table/wood, /obj/effect/turf_decal/siding/wood{ @@ -970,14 +993,10 @@ }, /turf/open/floor/wood, /area/virtual_domain/fullbright) -"ZF" = ( -/obj/effect/mapping_helpers/burnt_floor, -/obj/item/storage/bag/money/dutchmen{ - pixel_y = 13 - }, -/obj/structure/rack/skeletal, -/turf/open/floor/wood/parquet, -/area/virtual_domain) +"ZR" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/virtual_domain/protected_space/fullbright) (1,1,1) = {" xg @@ -1226,10 +1245,10 @@ DM hb hb hb -hb -hb -hb -hb +Mc +Mc +Mc +Mc xg xg xg @@ -1270,10 +1289,10 @@ DM hb hb DM -DM -DM -DM -hb +VP +VP +VP +Mc xg xg xg @@ -1314,10 +1333,10 @@ sj hb hb DM -DM -DM -DM -hb +VP +VP +VP +Mc xg xg xg @@ -1358,13 +1377,13 @@ mp Ov xp xp -xp -xp -xp -hb -hb -hb -hb +SE +SE +SE +Mc +Mc +Mc +Mc xg xg xg @@ -1402,15 +1421,15 @@ xp xp xp NE -xp -xp -xp -xp -xp -Ci -hb -hb -hb +SE +SE +SE +SE +SE +LX +Mc +Mc +Mc xg xg xg @@ -1446,15 +1465,15 @@ xp xp xp Gy -xp -xp -xp -xp -xp -Ci -bI -VE -hb +SE +SE +SE +SE +SE +LX +wn +Ka +Mc hb hb hb @@ -1490,15 +1509,15 @@ xp xp xp xp -xp -xp -xp -xp -nN -Ci -rn -VE -fw +SE +SE +SE +SE +JF +LX +dL +Ka +In ub ub ub @@ -1534,15 +1553,15 @@ xp xp xp xp -xp -xp -xp -xp -pi -Ci -QX -Yy -zk +SE +SE +SE +SE +TT +LX +DT +uS +SZ ub ub ub @@ -1578,15 +1597,15 @@ xp xp xp xp -xp -xp -xp -xp -xp -Ci -Ci -Yy -Dd +SE +SE +SE +SE +SE +LX +LX +uS +zA ub ub ub @@ -1600,7 +1619,7 @@ hb Ul tw To -ZF +AF tH Ul nr @@ -1622,15 +1641,15 @@ xp xp xp xp -xp -xp -xp -xp -xp -xp -xp -xp -Wx +SE +SE +SE +SE +SE +SE +SE +SE +ZR ub ub ub @@ -1666,15 +1685,15 @@ xp xp xp xp -xp -xp -xp -xp -xp -xp -xp -xp -xp +SE +SE +SE +SE +SE +SE +SE +SE +SE ub ub ub @@ -1710,15 +1729,15 @@ xp xp xp xp -xp -xp -xp -xp -xp -xp -xp -xp -xp +SE +SE +SE +SE +SE +SE +SE +SE +SE ub ub ub @@ -1736,7 +1755,7 @@ BU td Ul Ci -nb +Cq Mf gx tQ @@ -1754,15 +1773,15 @@ xp xp xp xp -xp -xp -xp -xp -xp -xp -xp -Wx -xp +SE +SE +SE +SE +SE +SE +SE +ZR +SE ub ub ub @@ -1798,15 +1817,15 @@ xp xp xp xp -xp -xp -xp -xp -xp -xp -Ci -fw -xp +SE +SE +SE +SE +SE +SE +LX +In +SE xp xp xp @@ -1842,15 +1861,15 @@ xp xp xp xp -xp -xp -xp -xp -xp -xp -Uw -cr -vR +SE +SE +SE +SE +SE +SE +XR +vX +dp xp xp xp @@ -1886,15 +1905,15 @@ xp xp xp xp -xp -xp -xp -xp -xp -af -Ci -LK -fw +SE +SE +SE +SE +SE +ce +LX +gN +In xp xp xp @@ -1930,15 +1949,15 @@ xp xp xp xp -xp -xp -xp -xp -xp -xp -oM -VE -eO +SE +SE +SE +SE +SE +SE +sH +Ka +QJ xp xp xp @@ -1974,15 +1993,15 @@ xp xp xp xp -xp -xp -xp -xp -xp -xp -xp -xp -xp +SE +SE +SE +SE +SE +SE +SE +SE +SE xp xp xp @@ -2018,15 +2037,15 @@ xp xp xp xp -xp -xp -xp -xp -xp -xp -xp -xp -xp +SE +SE +SE +SE +SE +SE +SE +SE +SE xp xp xp @@ -2062,15 +2081,15 @@ xp xp xp xp -xp -xp -xp -xp -xp -xp -xp -xp -xp +SE +SE +SE +SE +SE +SE +SE +SE +SE xp xp DM @@ -2097,8 +2116,8 @@ DM DM DM DM -eP -xp +RC +Nx DM DM hb @@ -2106,15 +2125,15 @@ hb xp xp xp -xp -xp -xp -xp -xp -xp -xp -xp -xp +SE +SE +SE +SE +SE +SE +SE +SE +SE hb DM DM @@ -2141,8 +2160,8 @@ DM DM DM DM -fd -OW +br +qT DM DM DM @@ -2150,15 +2169,15 @@ hb hb xp xp -xp -xp -xp -xp -xp -xp -xp -xp -hb +SE +SE +SE +SE +SE +SE +SE +SE +Mc hb DM DM @@ -2185,8 +2204,8 @@ DM DM DM DM -KV -OW +wf +qT DM DM DM @@ -2194,15 +2213,15 @@ DM hb hb hb -hb -xp -xp -xp -xp -xp -xp -hb -hb +Mc +SE +SE +SE +SE +SE +SE +Mc +Mc hb hb hb @@ -2229,23 +2248,23 @@ DM DM DM DM -qk -IW -xp +qR +Ic +Nx DM DM DM DM DM DM -hb -hb -hb -hb -hb -hb -hb -hb +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc xg xg xg @@ -2273,11 +2292,11 @@ DM DM DM DM -Gl -qk -IW -hn -xp +lM +qR +Ic +ki +Nx DM DM DM @@ -2318,13 +2337,13 @@ DM DM DM DM -qk -qk -Oi -OW -xp -be -Oz +qR +qR +OE +qT +Nx +na +GM DM DM DM @@ -2363,13 +2382,13 @@ DM DM DM DM -qk -CL -IW -xp -QG -qk -rm +qR +dz +Ic +Nx +MO +qR +MJ DM DM DM @@ -2407,14 +2426,14 @@ DM DM DM DM -oB -qk -wu -IW -QF -BX -qk -rm +KW +qR +OB +Ic +hp +kl +qR +MJ DM DM hb @@ -2452,13 +2471,13 @@ DM DM DM DM -qk -qk -NU -db -hq -zc -ID +qR +qR +kE +hx +vo +cT +tR DM DM hb diff --git a/_maps/virtual_domains/psyker_zombies.dmm b/_maps/virtual_domains/psyker_zombies.dmm index a20e260bbcf..1d4307ebdce 100644 --- a/_maps/virtual_domains/psyker_zombies.dmm +++ b/_maps/virtual_domains/psyker_zombies.dmm @@ -19,7 +19,7 @@ "h" = ( /obj/structure/rack, /turf/open/indestructible/dark, -/area/ruin/space/has_grav/powered/virtual_domain) +/area/virtual_domain/protected_space) "i" = ( /obj/structure/sign/warning/directional/east, /turf/open/chasm, @@ -61,10 +61,20 @@ /obj/effect/mapping_helpers/airlock/abandoned, /turf/open/indestructible/dark, /area/ruin/space/has_grav/powered/virtual_domain) +"D" = ( +/turf/open/indestructible/dark, +/area/virtual_domain/protected_space) "F" = ( /obj/structure/mystery_box/guns, /turf/open/indestructible/dark, -/area/ruin/space/has_grav/powered/virtual_domain) +/area/virtual_domain/protected_space) +"I" = ( +/turf/closed/indestructible/binary, +/area/virtual_domain/protected_space) +"J" = ( +/obj/machinery/door/airlock/abductor, +/turf/open/indestructible/dark, +/area/virtual_domain/protected_space) "K" = ( /obj/effect/baseturf_helper/virtual_domain, /turf/closed/indestructible/binary, @@ -530,10 +540,10 @@ Y Y a Y -a -a -a -a +I +I +I +I a a a @@ -557,10 +567,10 @@ Y Y Y Y -a +I h -Y -Y +D +D t t t @@ -584,10 +594,10 @@ X Y Y Y -a +I F -Y -Y +D +D t t t @@ -611,10 +621,10 @@ a Y Y Y -a -Y -Y -Y +I +D +D +D t t t @@ -638,10 +648,10 @@ Y Y Y Y -T -Y -Y -Y +J +D +D +D t t t @@ -665,10 +675,10 @@ Y R Y Y -a -Y -Y -Y +I +D +D +D t t t @@ -692,10 +702,10 @@ Y Y Y Y -a +I F -Y -Y +D +D t t t @@ -719,10 +729,10 @@ a a Y Y -a +I h -Y -Y +D +D t t t @@ -746,10 +756,10 @@ a a a Y -a -a -a -a +I +I +I +I a a a diff --git a/_maps/virtual_domains/syndicate_assault.dmm b/_maps/virtual_domains/syndicate_assault.dmm index 5152cfcb503..a53fcada8f8 100644 --- a/_maps/virtual_domains/syndicate_assault.dmm +++ b/_maps/virtual_domains/syndicate_assault.dmm @@ -1,4 +1,16 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ae" = ( +/obj/machinery/door/password/voice/sfc{ + password = null + }, +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/grunge{ + desc = "Vault airlock preventing air from going out."; + name = "Syndicate Vault Airlock" + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/pod/dark, +/area/virtual_domain/protected_space) "aq" = ( /obj/item/storage/backpack/duffelbag/syndie/surgery, /obj/structure/table/reinforced, @@ -12,21 +24,6 @@ /obj/effect/landmark/bitrunning/mob_segment, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/virtual_domain) -"aN" = ( -/obj/structure/closet/crate/secure/gear{ - req_access = list("syndicate") - }, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/plasteel/twenty, -/obj/item/stack/sheet/mineral/plastitanium{ - amount = 50 - }, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/rods/fifty, -/turf/open/floor/pod/dark, -/area/ruin/space/has_grav/powered/virtual_domain) "aO" = ( /obj/machinery/recharge_station, /turf/open/floor/mineral/plastitanium, @@ -42,9 +39,18 @@ }, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/virtual_domain) -"bG" = ( -/turf/open/floor/pod/dark, -/area/ruin/space/has_grav/powered/virtual_domain) +"bO" = ( +/obj/machinery/door/airlock/external/ruin{ + name = "Syndicate Ship Airlock" + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/obj/structure/cable, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/virtual_domain/protected_space) +"bT" = ( +/turf/closed/mineral/random, +/area/virtual_domain/protected_space) "cc" = ( /obj/structure/closet/crate/secure/gear{ req_access = list("syndicate") @@ -52,10 +58,6 @@ /obj/effect/spawner/random/clothing/costume, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/virtual_domain) -"cj" = ( -/obj/structure/transit_tube/crossing, -/turf/closed/wall/r_wall/syndicate, -/area/ruin/space/has_grav/powered/virtual_domain) "ct" = ( /obj/structure/closet/syndicate{ anchored = 1; @@ -110,12 +112,6 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/carpet/royalblack, /area/ruin/space/has_grav/powered/virtual_domain) -"cZ" = ( -/obj/structure/table/reinforced, -/obj/item/gun/ballistic/automatic/l6_saw/unrestricted, -/obj/item/ammo_box/magazine/m7mm, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/powered/virtual_domain) "da" = ( /obj/machinery/stasis, /turf/open/floor/plastic, @@ -149,34 +145,21 @@ /obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/virtual_domain) -"eB" = ( -/obj/machinery/camera/xray{ - c_tag = "Cargo pod"; - dir = 9; - network = list("fsci"); - screen_loc = "" - }, -/obj/structure/closet, -/obj/item/clothing/under/syndicate/tacticool, -/obj/item/clothing/under/syndicate/tacticool, -/obj/item/clothing/under/syndicate/tacticool, -/obj/item/card/id/advanced/black/syndicate_command/crew_id, -/obj/item/card/id/advanced/black/syndicate_command/crew_id, -/obj/item/card/id/advanced/black/syndicate_command/crew_id, +"ej" = ( +/obj/structure/cable, /turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/powered/virtual_domain) -"fc" = ( -/obj/structure/filingcabinet, -/obj/machinery/door/window/left/directional/west{ - name = "Syndicate Interior Door"; +/area/virtual_domain/protected_space) +"fB" = ( +/obj/machinery/ore_silo, +/turf/open/floor/mineral/plastitanium, +/area/virtual_domain/protected_space) +"fE" = ( +/obj/structure/closet/crate/secure/gear{ req_access = list("syndicate") }, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/powered/virtual_domain) -"fd" = ( -/obj/structure/transit_tube/crossing, -/turf/open/space/basic, -/area/space) +/obj/item/disk/surgery/forgottenship, +/turf/open/floor/pod/dark, +/area/virtual_domain/protected_space) "fG" = ( /obj/structure/toilet{ dir = 1 @@ -192,17 +175,14 @@ /obj/machinery/atmospherics/components/unary/vent_pump, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/powered/virtual_domain) -"gw" = ( -/obj/machinery/door/window/left/directional/north{ - name = "Spare Equipment"; - req_access = list("syndicate") - }, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/powered/virtual_domain) -"gD" = ( -/obj/effect/mob_spawn/ghost_role/human/syndicatespace, +"gc" = ( +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/syndie, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/virtual_domain) +"gF" = ( +/obj/machinery/suit_storage_unit/syndicate, +/turf/open/floor/mineral/plastitanium, +/area/virtual_domain/protected_space) "hg" = ( /obj/structure/window/reinforced/plasma/plastitanium, /obj/machinery/door/poddoor{ @@ -233,18 +213,6 @@ /obj/machinery/light/directional/north, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/powered/virtual_domain) -"iL" = ( -/obj/structure/sign/departments/cargo, -/turf/closed/wall/r_wall/syndicate, -/area/ruin/space/has_grav/powered/virtual_domain) -"iU" = ( -/obj/structure/closet/crate/secure/gear{ - req_access = list("syndicate") - }, -/obj/item/melee/energy/sword/saber/red, -/obj/machinery/light/small/directional/north, -/turf/open/floor/pod/dark, -/area/ruin/space/has_grav/powered/virtual_domain) "iW" = ( /obj/structure/table/reinforced, /obj/machinery/button/door{ @@ -266,6 +234,13 @@ }, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/virtual_domain) +"ja" = ( +/obj/machinery/door/window/left/directional/north{ + name = "Spare Equipment"; + req_access = list("syndicate") + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/powered/virtual_domain) "jl" = ( /obj/structure/bodycontainer/crematorium{ id = "fscremate" @@ -322,12 +297,6 @@ }, /turf/template_noop, /area/virtual_domain/safehouse) -"li" = ( -/obj/structure/transit_tube/station/dispenser/reverse{ - dir = 4 - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/powered/virtual_domain) "ln" = ( /obj/machinery/turretid{ control_area = "/area/ruin/space/has_grav/syndicate_forgotten_ship"; @@ -348,10 +317,23 @@ /obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/virtual_domain) +"lv" = ( +/obj/structure/table/reinforced, +/obj/item/storage/medkit/regular, +/obj/machinery/light/small/directional/north, +/turf/open/floor/mineral/plastitanium, +/area/virtual_domain/protected_space) "lN" = ( /obj/machinery/light/small/directional/east, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/virtual_domain) +"mk" = ( +/obj/structure/cable, +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/syndicate, +/obj/item/storage/toolbox/syndicate, +/turf/open/floor/mineral/plastitanium, +/area/virtual_domain/protected_space) "mo" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/layer2{ dir = 8 @@ -433,15 +415,19 @@ "qx" = ( /turf/open/space/basic, /area/space) -"qU" = ( -/obj/structure/sign/poster/contraband/c20r, -/turf/closed/wall/r_wall/syndicate, -/area/ruin/space/has_grav/powered/virtual_domain) "qY" = ( /obj/machinery/light/small/directional/south, /obj/effect/landmark/bitrunning/cache_spawn, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/powered/virtual_domain) +"rg" = ( +/obj/structure/table/reinforced, +/obj/item/ammo_box/magazine/smgm45, +/obj/item/ammo_box/magazine/smgm45, +/obj/item/ammo_box/magazine/smgm45, +/obj/item/gun/ballistic/automatic/c20r/unrestricted, +/turf/open/floor/mineral/plastitanium, +/area/virtual_domain/protected_space) "rm" = ( /obj/machinery/button/crematorium{ id = "fscremate"; @@ -452,6 +438,9 @@ "ru" = ( /turf/closed/wall/r_wall/syndicate, /area/ruin/space/has_grav/powered/virtual_domain) +"rA" = ( +/turf/open/floor/pod/dark, +/area/virtual_domain/protected_space) "rH" = ( /obj/machinery/airalarm/directional/north, /obj/effect/mapping_helpers/airalarm/syndicate_access, @@ -469,14 +458,12 @@ /obj/effect/spawner/random/contraband/armory, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/powered/virtual_domain) -"rP" = ( -/obj/effect/mob_spawn/ghost_role/human/syndicatespace, -/obj/machinery/light/small/directional/south, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/powered/virtual_domain) -"sg" = ( -/obj/machinery/ore_silo, -/turf/open/floor/mineral/plastitanium, +"sq" = ( +/obj/machinery/door/window/left/directional/south{ + name = "Control Room"; + req_access = list("syndicate") + }, +/turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/powered/virtual_domain) "sz" = ( /obj/machinery/atmospherics/components/unary/vent_pump{ @@ -491,18 +478,6 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/powered/virtual_domain) -"sK" = ( -/obj/structure/closet/crate/secure/gear{ - req_access = list("syndicate") - }, -/obj/item/stack/sheet/mineral/titanium{ - amount = 40 - }, -/obj/item/stack/sheet/mineral/uranium{ - amount = 15 - }, -/turf/open/floor/pod/dark, -/area/ruin/space/has_grav/powered/virtual_domain) "sL" = ( /obj/structure/chair/comfy, /turf/open/floor/mineral/plastitanium, @@ -562,6 +537,14 @@ "we" = ( /turf/closed/mineral/random/high_chance, /area/space) +"wu" = ( +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/syndie, +/turf/open/floor/carpet/royalblack, +/area/ruin/space/has_grav/powered/virtual_domain) +"wG" = ( +/obj/structure/sign/poster/contraband/tools, +/turf/closed/wall/r_wall/syndicate, +/area/virtual_domain/protected_space) "wK" = ( /obj/machinery/door/airlock/grunge{ name = "Syndicate Ship Airlock" @@ -569,12 +552,10 @@ /obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/powered/virtual_domain) -"wL" = ( -/obj/structure/table/reinforced, -/obj/item/storage/medkit/regular, -/obj/machinery/light/small/directional/north, +"xF" = ( +/obj/machinery/light/small/directional/south, /turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/powered/virtual_domain) +/area/virtual_domain/protected_space) "xJ" = ( /obj/structure/closet/syndicate{ anchored = 1; @@ -587,6 +568,9 @@ /obj/item/ammo_box/c9mm, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/powered/virtual_domain) +"xN" = ( +/turf/closed/wall/r_wall/syndicate, +/area/virtual_domain/protected_space) "yl" = ( /obj/machinery/door/airlock/grunge{ name = "Captain's Room" @@ -632,6 +616,21 @@ /obj/machinery/vending/cigarette/syndicate, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/virtual_domain) +"zj" = ( +/obj/structure/closet/crate/secure/gear{ + req_access = list("syndicate") + }, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/plasteel/twenty, +/obj/item/stack/sheet/mineral/plastitanium{ + amount = 50 + }, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/rods/fifty, +/turf/open/floor/pod/dark, +/area/virtual_domain/protected_space) "zt" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/layer2{ @@ -639,14 +638,34 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/powered/virtual_domain) +"zG" = ( +/obj/structure/sign/departments/cargo, +/turf/closed/wall/r_wall/syndicate, +/area/virtual_domain/protected_space) +"zZ" = ( +/obj/machinery/camera/xray{ + c_tag = "Cargo pod"; + dir = 9; + network = list("fsci"); + screen_loc = "" + }, +/obj/structure/closet, +/obj/item/clothing/under/syndicate/tacticool, +/obj/item/clothing/under/syndicate/tacticool, +/obj/item/clothing/under/syndicate/tacticool, +/obj/item/card/id/advanced/black/syndicate_command/crew_id, +/obj/item/card/id/advanced/black/syndicate_command/crew_id, +/obj/item/card/id/advanced/black/syndicate_command/crew_id, +/turf/open/floor/mineral/plastitanium, +/area/virtual_domain/protected_space) "Aa" = ( /obj/structure/chair/comfy/shuttle, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/virtual_domain) -"Bm" = ( -/obj/effect/baseturf_helper/virtual_domain, -/turf/closed/indestructible/syndicate, -/area/ruin/space/has_grav/powered/virtual_domain) +"Bo" = ( +/obj/structure/transit_tube/crossing, +/turf/closed/mineral/random, +/area/virtual_domain/protected_space) "BK" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, @@ -682,6 +701,14 @@ }, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/virtual_domain) +"Cx" = ( +/obj/structure/closet/crate/secure/gear{ + req_access = list("syndicate") + }, +/obj/item/melee/energy/sword/saber/red, +/obj/machinery/light/small/directional/north, +/turf/open/floor/pod/dark, +/area/virtual_domain/protected_space) "CK" = ( /obj/structure/chair/comfy/shuttle{ dir = 4 @@ -704,6 +731,12 @@ /obj/item/storage/box/firingpins/syndicate, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/powered/virtual_domain) +"CZ" = ( +/obj/structure/transit_tube/station/dispenser/reverse{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium, +/area/virtual_domain/protected_space) "De" = ( /obj/machinery/door/airlock/grunge{ name = "Syndicate Ship Airlock" @@ -711,14 +744,9 @@ /obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/powered/virtual_domain) -"Dj" = ( -/obj/structure/table/reinforced, -/obj/item/ammo_box/magazine/smgm45, -/obj/item/ammo_box/magazine/smgm45, -/obj/item/ammo_box/magazine/smgm45, -/obj/item/gun/ballistic/automatic/c20r/unrestricted, +"Dv" = ( /turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/powered/virtual_domain) +/area/virtual_domain/protected_space) "DA" = ( /obj/structure/closet/crate/secure/gear{ req_access = list("syndicate") @@ -748,12 +776,31 @@ }, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/virtual_domain) +"FX" = ( +/obj/structure/closet/crate/secure/gear{ + req_access = list("syndicate") + }, +/obj/item/stack/sheet/mineral/titanium{ + amount = 40 + }, +/obj/item/stack/sheet/mineral/uranium{ + amount = 15 + }, +/turf/open/floor/pod/dark, +/area/virtual_domain/protected_space) +"Gc" = ( +/turf/open/space/basic, +/area/virtual_domain/protected_space) "Gn" = ( /obj/structure/chair/comfy{ dir = 1 }, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/virtual_domain) +"Gp" = ( +/obj/structure/tank_dispenser/oxygen, +/turf/open/floor/mineral/plastitanium, +/area/virtual_domain/protected_space) "Gs" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ @@ -790,10 +837,6 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/powered/virtual_domain) -"Ia" = ( -/obj/effect/mob_spawn/ghost_role/human/syndicatespace/captain, -/turf/open/floor/carpet/royalblack, -/area/ruin/space/has_grav/powered/virtual_domain) "Id" = ( /obj/machinery/power/shuttle_engine/huge{ dir = 8 @@ -834,15 +877,6 @@ /obj/item/pen, /turf/open/floor/carpet/royalblack, /area/ruin/space/has_grav/powered/virtual_domain) -"IH" = ( -/obj/machinery/door/airlock/external/ruin{ - name = "Syndicate Ship Airlock" - }, -/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, -/obj/structure/cable, -/obj/structure/fans/tiny, -/turf/open/floor/plating, -/area/ruin/space/has_grav/powered/virtual_domain) "IV" = ( /obj/machinery/door/airlock/grunge{ name = "Syndicate Ship Airlock" @@ -883,10 +917,20 @@ "Kz" = ( /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/powered/virtual_domain) -"Lk" = ( -/obj/structure/transit_tube/crossing, -/turf/closed/mineral/random, -/area/space) +"Lo" = ( +/obj/structure/filingcabinet, +/obj/machinery/door/window/left/directional/west{ + name = "Syndicate Interior Door"; + req_access = list("syndicate") + }, +/turf/open/floor/mineral/plastitanium/red, +/area/ruin/space/has_grav/powered/virtual_domain) +"LB" = ( +/obj/structure/closet/crate/secure/gear{ + req_access = list("syndicate") + }, +/turf/open/floor/pod/dark, +/area/virtual_domain/protected_space) "Mc" = ( /obj/structure/closet/syndicate{ anchored = 1; @@ -926,43 +970,16 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/powered/virtual_domain) -"Nm" = ( -/obj/structure/closet/crate/secure/gear{ - req_access = list("syndicate") - }, -/turf/open/floor/pod/dark, -/area/ruin/space/has_grav/powered/virtual_domain) -"Nr" = ( -/obj/structure/closet/crate/secure/gear{ - req_access = list("syndicate") - }, -/obj/item/stack/sheet/mineral/gold{ - amount = 30 - }, -/obj/item/stack/sheet/mineral/silver{ - amount = 30 - }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/pod/dark, -/area/ruin/space/has_grav/powered/virtual_domain) -"Of" = ( -/obj/structure/closet/crate/secure/gear{ - req_access = list("syndicate") - }, -/obj/item/disk/surgery/forgottenship, -/turf/open/floor/pod/dark, -/area/ruin/space/has_grav/powered/virtual_domain) +"Nw" = ( +/obj/structure/table/reinforced, +/obj/item/gun/ballistic/automatic/l6_saw/unrestricted, +/obj/item/ammo_box/magazine/m7mm, +/turf/open/floor/mineral/plastitanium, +/area/virtual_domain/protected_space) "Ox" = ( /obj/machinery/atmospherics/components/unary/vent_pump, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/virtual_domain) -"OH" = ( -/obj/structure/cable, -/obj/structure/table/reinforced, -/obj/item/storage/toolbox/syndicate, -/obj/item/storage/toolbox/syndicate, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/powered/virtual_domain) "OI" = ( /obj/structure/chair/comfy/shuttle{ dir = 1 @@ -970,18 +987,10 @@ /obj/structure/cable, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/virtual_domain) -"PR" = ( -/obj/machinery/door/password/voice/sfc{ - password = null - }, -/obj/structure/fans/tiny, -/obj/machinery/door/airlock/grunge{ - desc = "Vault airlock preventing air from going out."; - name = "Syndicate Vault Airlock" - }, -/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, -/turf/open/floor/pod/dark, -/area/ruin/space/has_grav/powered/virtual_domain) +"Pg" = ( +/obj/structure/sign/poster/contraband/c20r, +/turf/closed/wall/r_wall/syndicate, +/area/virtual_domain/protected_space) "Qg" = ( /obj/machinery/suit_storage_unit/syndicate{ helmet_type = /obj/item/clothing/head/helmet/space/syndicate/black; @@ -997,12 +1006,23 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/powered/virtual_domain) -"QF" = ( -/obj/structure/table/reinforced, -/obj/item/dualsaber/green, -/obj/machinery/light/small/directional/east, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/powered/virtual_domain) +"Qu" = ( +/obj/structure/transit_tube/crossing, +/turf/open/space/basic, +/area/virtual_domain/protected_space) +"Qz" = ( +/obj/structure/closet/crate/secure/gear{ + req_access = list("syndicate") + }, +/obj/item/stack/sheet/mineral/gold{ + amount = 30 + }, +/obj/item/stack/sheet/mineral/silver{ + amount = 30 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/pod/dark, +/area/virtual_domain/protected_space) "QG" = ( /obj/structure/tank_dispenser/oxygen, /turf/closed/mineral/random, @@ -1023,10 +1043,6 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/powered/virtual_domain) -"RU" = ( -/obj/machinery/suit_storage_unit/syndicate, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/powered/virtual_domain) "Sc" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -1069,9 +1085,15 @@ /obj/machinery/vending/medical/syndicate_access/cybersun, /turf/open/floor/plastic, /area/ruin/space/has_grav/powered/virtual_domain) -"TB" = ( +"UH" = ( +/obj/structure/table/reinforced, +/obj/item/dualsaber/green, +/obj/machinery/light/small/directional/east, +/turf/open/floor/mineral/plastitanium, +/area/virtual_domain/protected_space) +"UM" = ( /turf/closed/indestructible/syndicate, -/area/ruin/space/has_grav/powered/virtual_domain) +/area/virtual_domain/protected_space) "UQ" = ( /obj/structure/sign/poster/contraband/syndicate_recruitment, /turf/closed/wall/r_wall/syndicate, @@ -1091,10 +1113,10 @@ }, /turf/template_noop, /area/virtual_domain/safehouse) -"Wd" = ( -/obj/structure/sign/poster/contraband/tools, +"Vs" = ( +/obj/structure/transit_tube/crossing, /turf/closed/wall/r_wall/syndicate, -/area/ruin/space/has_grav/powered/virtual_domain) +/area/virtual_domain/protected_space) "Wy" = ( /obj/structure/closet/crate/secure/gear{ req_access = list("syndicate") @@ -1111,20 +1133,29 @@ /obj/structure/cable, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/powered/virtual_domain) +"WT" = ( +/obj/machinery/light/small/directional/south, +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/syndie, +/turf/open/floor/mineral/plastitanium, +/area/ruin/space/has_grav/powered/virtual_domain) "Xp" = ( /turf/open/space/basic, /area/ruin/space/has_grav/powered/virtual_domain) -"XS" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/powered/virtual_domain) -"Yb" = ( +"Xu" = ( /obj/structure/closet/crate/secure/gear{ req_access = list("syndicate") }, /obj/item/clothing/head/helmet/space/syndicate/black/engie, /obj/item/clothing/suit/space/syndicate/black/engie, /turf/open/floor/pod/dark, +/area/virtual_domain/protected_space) +"XG" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/closed/indestructible/syndicate, +/area/virtual_domain/protected_space) +"XS" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/virtual_domain) "Yi" = ( /obj/effect/landmark/bitrunning/cache_spawn, @@ -1171,13 +1202,6 @@ "Zb" = ( /turf/open/floor/plastic, /area/ruin/space/has_grav/powered/virtual_domain) -"Zf" = ( -/obj/machinery/door/window/left/directional/south{ - name = "Control Room"; - req_access = list("syndicate") - }, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/powered/virtual_domain) "ZA" = ( /obj/machinery/power/shuttle_engine/propulsion{ dir = 8 @@ -2127,7 +2151,7 @@ ru ru vp ru -Ia +wu Ci ru Sq @@ -2196,7 +2220,7 @@ Mc uP uP uP -rP +WT ru qx qx @@ -2264,10 +2288,10 @@ qx qx nB nB -TB -TB -TB -TB +UM +UM +UM +UM nB nB qx @@ -2321,12 +2345,12 @@ qx qx nB nB -TB -TB -Yb -Yb -TB -Bm +UM +UM +Xu +Xu +UM +XG nB qx qx @@ -2370,7 +2394,7 @@ Sd uP uP uP -gD +gc ru qx qx @@ -2379,12 +2403,12 @@ qx nB QG nB -TB -aN -bG -bG -sK -TB +UM +zj +rA +rA +FX +UM nB qx qx @@ -2415,7 +2439,7 @@ qx qx Ig ru -fc +Lo ru tv ki @@ -2437,12 +2461,12 @@ qx nB we nB -TB -iU -bG -bG -Nr -TB +UM +Cx +rA +rA +Qz +UM nB we qx @@ -2495,12 +2519,12 @@ qx qx nB nB -TB -Nm -bG -bG -Of -TB +UM +LB +rA +rA +fE +UM nB nB qx @@ -2553,12 +2577,12 @@ qx nB nB nB -TB -TB -PR -TB -TB -TB +UM +UM +ae +UM +UM +UM nB nB nB @@ -2611,21 +2635,21 @@ qx nB nB we -ru -ru -uP -sg -ru -ru -nB -nB -nB -nB -qx -qx -qx -qx -qx +xN +xN +Dv +fB +xN +xN +bT +bT +bT +bT +Gc +Gc +Gc +Gc +Gc sM sM sM @@ -2669,21 +2693,21 @@ qx qx nB nB -qU -Fp -uP -uP -li -cj -Lk -Lk -fd -fd -fd -fd -fd -fd -fd +Pg +Gp +Dv +Dv +CZ +Vs +Bo +Bo +Qu +Qu +Qu +Qu +Qu +Qu +Qu BN Vq sM @@ -2727,21 +2751,21 @@ qx qx nB nB -ru -eB -uP -uP -uP -ru -nB -qx -qx -qx -qx -qx -qx -qx -qx +xN +zZ +Dv +Dv +Dv +xN +bT +Gc +Gc +Gc +Gc +Gc +Gc +Gc +Gc sM sM sM @@ -2785,12 +2809,12 @@ qx qx qx nB -ru -wL -oM -uP -dw -ru +xN +lv +ej +Dv +xF +xN yZ nB nB @@ -2843,12 +2867,12 @@ qx qx qx qx -Wd -OH -oM -uP -RU -ru +wG +mk +ej +Dv +gF +xN we nB nB @@ -2901,12 +2925,12 @@ BK BK BK BK -IH -oM -oM -uP -RU -ru +bO +ej +ej +Dv +gF +xN nB nB qx @@ -2959,12 +2983,12 @@ qx qx qx qx -iL -cZ -uP -uP -RU -ru +zG +Nw +Dv +Dv +gF +xN nB nB qx @@ -3017,12 +3041,12 @@ qx qx qx nB -ru -ru -Dj -QF -ru -ru +xN +xN +rg +UH +xN +xN nB nB qx @@ -3076,10 +3100,10 @@ qx nB nB nB -ru -ru -ru -ru +xN +xN +xN +xN nB nB we @@ -3344,7 +3368,7 @@ qx ru Kz dz -Zf +sq Kz CK Kz @@ -3354,7 +3378,7 @@ vU Kz CK Kz -gw +ja Kz Jg ru diff --git a/code/__DEFINES/_flags.dm b/code/__DEFINES/_flags.dm index 09f2e040bd3..7d9e46c7de8 100644 --- a/code/__DEFINES/_flags.dm +++ b/code/__DEFINES/_flags.dm @@ -134,6 +134,8 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define EVENT_PROTECTED (1<<15) /// This Area Doesn't have Flood or Bomb Admin Messages, but will still log #define QUIET_LOGS (1<<16) +/// This area does not allow virtual entities to enter. +#define VIRTUAL_SAFE_AREA (1<<17) /* These defines are used specifically with the atom/pass_flags bitmask diff --git a/code/__DEFINES/admin_verb.dm b/code/__DEFINES/admin_verb.dm index cbf856bf436..04806e098b2 100644 --- a/code/__DEFINES/admin_verb.dm +++ b/code/__DEFINES/admin_verb.dm @@ -87,6 +87,7 @@ _ADMIN_VERB(verb_path_name, verb_permissions, verb_name, verb_desc, verb_categor #define ADMIN_CATEGORY_OBJECT "Object" #define ADMIN_CATEGORY_MAPPING "Mapping" #define ADMIN_CATEGORY_PROFILE "Profile" +#define ADMIN_CATEGORY_IPINTEL "Admin.IPIntel" // Visibility flags #define ADMIN_VERB_VISIBLITY_FLAG_MAPPING_DEBUG "Map-Debug" diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm index 3a5398c9f8a..a615cb92ead 100644 --- a/code/__DEFINES/antagonists.dm +++ b/code/__DEFINES/antagonists.dm @@ -238,6 +238,8 @@ GLOBAL_LIST_INIT(ai_employers, list( #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 in the mansus realm +#define IS_IN_MANSUS(mob) (istype(get_area(mob), /area/centcom/heretic_sacrifice)) /// Checks if the given mob is a wizard #define IS_WIZARD(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/wizard)) @@ -251,6 +253,9 @@ GLOBAL_LIST_INIT(ai_employers, list( /// Checks if the given mob is a malf ai. #define IS_MALF_AI(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/malf_ai)) +/// Checks if the given mob is a spy! +#define IS_SPY(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/spy)) + /// List of human antagonist types which don't spawn directly on the space station GLOBAL_LIST_INIT(human_invader_antagonists, list( /datum/antagonist/abductor, diff --git a/code/__DEFINES/crafting.dm b/code/__DEFINES/crafting.dm index 647278aa3ec..54dc479aa73 100644 --- a/code/__DEFINES/crafting.dm +++ b/code/__DEFINES/crafting.dm @@ -7,6 +7,28 @@ ///If the structure is only "used" i.e. it checks to see if it's nearby and allows crafting, but doesn't delete it #define CRAFTING_STRUCTURE_USE 0 +//stack recipe placement check types +/// Checks if there is an object of the result type in any of the cardinal directions +#define STACK_CHECK_CARDINALS (1<<0) +/// Checks if there is an object of the result type within one tile +#define STACK_CHECK_ADJACENT (1<<1) + +//---- Defines for var/crafting_flags +///If this craft must be learned before it becomes available +#define CRAFT_MUST_BE_LEARNED (1<<0) +///Should only one object exist on the same turf? +#define CRAFT_ONE_PER_TURF (1<<1) +/// Setting this to true will effectively set check_direction to true. +#define CRAFT_IS_FULLTILE (1<<2) +/// If this craft should run the direction check, for use when building things like directional windows where you can have more than one per turf +#define CRAFT_CHECK_DIRECTION (1<<3) +/// If the craft requires a floor below +#define CRAFT_ON_SOLID_GROUND (1<<4) +/// If the craft checks that there are objects with density in the same turf when being built +#define CRAFT_CHECK_DENSITY (1<<5) +/// If the created atom will gain custom mat datums +#define CRAFT_APPLIES_MATS (1<<6) + //food/drink crafting defines //When adding new defines, please make sure to also add them to the encompassing list #define CAT_FOOD "Foods" diff --git a/code/__DEFINES/dcs/signals/signals_bitrunning.dm b/code/__DEFINES/dcs/signals/signals_bitrunning.dm index 74d418182d5..150c2608022 100644 --- a/code/__DEFINES/dcs/signals/signals_bitrunning.dm +++ b/code/__DEFINES/dcs/signals/signals_bitrunning.dm @@ -44,3 +44,6 @@ // Ladder /// from /obj/structure/hololadder/disconnect() #define COMSIG_BITRUNNER_LADDER_SEVER "bitrunner_ladder_sever" + +/// Sent when a server console is emagged +#define COMSIG_BITRUNNER_SERVER_EMAGGED "bitrunner_server_emagged" diff --git a/code/__DEFINES/icon_smoothing.dm b/code/__DEFINES/icon_smoothing.dm index 5bc302a8d35..23b90eb1613 100644 --- a/code/__DEFINES/icon_smoothing.dm +++ b/code/__DEFINES/icon_smoothing.dm @@ -16,6 +16,10 @@ /// it represents the sides of our directional border object that have a neighbor /// Is incompatible with SMOOTH_CORNERS because border objects don't have corners #define SMOOTH_BORDER_OBJECT (1<<6) +/// Has a smooth broken sprite, used to decide whether to apply an offset to the broken overlay or not. For /turf/open only. +#define SMOOTH_BROKEN_TURF (1<<7) +/// Has a smooth burnt sprite, used to decide whether to apply an offset to the burnt overlay or not. For /turf/open only. +#define SMOOTH_BURNT_TURF (1<<8) DEFINE_BITFIELD(smoothing_flags, list( "SMOOTH_CORNERS" = SMOOTH_CORNERS, @@ -25,6 +29,8 @@ DEFINE_BITFIELD(smoothing_flags, list( "SMOOTH_QUEUED" = SMOOTH_QUEUED, "SMOOTH_OBJ" = SMOOTH_OBJ, "SMOOTH_BORDER_OBJECT" = SMOOTH_BORDER_OBJECT, + "SMOOTH_BROKEN_TURF" = SMOOTH_BROKEN_TURF, + "SMOOTH_BURNT_TURF" = SMOOTH_BURNT_TURF, )) /// Components of a smoothing junction diff --git a/code/__DEFINES/ipintel.dm b/code/__DEFINES/ipintel.dm new file mode 100644 index 00000000000..9fbc14ae40d --- /dev/null +++ b/code/__DEFINES/ipintel.dm @@ -0,0 +1,15 @@ +#define IPINTEL_RATE_LIMIT_MINUTE "minute" +#define IPINTEL_RATE_LIMIT_DAY "day" + +/// An internal error occurred and the query cannot be processed +#define IPINTEL_UNKNOWN_INTERNAL_ERROR "unknown_internal_error" +/// An error occurred with the query and the result is unknown +#define IPINTEL_UNKNOWN_QUERY_ERROR "unknown_query_error" +/// Cannot query as we are rate limited for the rest of the day +#define IPINTEL_RATE_LIMITED_DAY "rate_limited_day" +/// Cannot query as we are rate limited for the rest of the minute +#define IPINTEL_RATE_LIMITED_MINUTE "rate_limited_minute" +/// The IP address is a VPN or bad IP +#define IPINTEL_BAD_IP "bad_ip" +/// The IP address is not a VPN or bad IP +#define IPINTEL_GOOD_IP "good_ip" diff --git a/code/__DEFINES/projectiles.dm b/code/__DEFINES/projectiles.dm index e471fe2324d..ae61c5e50b7 100644 --- a/code/__DEFINES/projectiles.dm +++ b/code/__DEFINES/projectiles.dm @@ -64,6 +64,8 @@ #define CALIBER_HOOK "hook" /// The caliber used by the changeling tentacle mutation. #define CALIBER_TENTACLE "tentacle" +/// The caliber used by pipeguns and pipe pistols +#define CALIBER_JUNK "junk" /// For gunpoints, how many tiles around the target the shooter can roam without losing their shot #define GUNPOINT_SHOOTER_STRAY_RANGE 2 diff --git a/code/__DEFINES/pronouns.dm b/code/__DEFINES/pronouns.dm index c0515426e35..d137970f217 100644 --- a/code/__DEFINES/pronouns.dm +++ b/code/__DEFINES/pronouns.dm @@ -17,6 +17,8 @@ /// s, null (she looks, they look) "%PRONOUN_s" = "p_s" /// es, null (she goes, they go) "%PRONOUN_es" = "p_es" +/// Don't forget to update the grep if you add more! tools/ci/check_grep.sh -> pronoun helper spellcheck + /// A list for all the pronoun procs, if you need to iterate or search through it or something. #define ALL_PRONOUNS list( \ "%PRONOUN_they" = TYPE_PROC_REF(/datum, p_they), \ diff --git a/code/__DEFINES/skills.dm b/code/__DEFINES/skills.dm index f6ecde7c2e1..5a945d7ec57 100644 --- a/code/__DEFINES/skills.dm +++ b/code/__DEFINES/skills.dm @@ -46,3 +46,9 @@ ///The base modifier a boulder's size grants to the mining skill. #define MINING_SKILL_BOULDER_SIZE_XP 10 + +// Skillchip categories +//Various skillchip categories. Use these when setting which categories a skillchip restricts being paired with +//while using the SKILLCHIP_RESTRICTED_CATEGORIES flag +#define SKILLCHIP_CATEGORY_GENERAL "general" +#define SKILLCHIP_CATEGORY_JOB "job" diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 402b104cabf..78bc696014f 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -20,7 +20,7 @@ * * make sure you add an update to the schema_version stable in the db changelog */ -#define DB_MINOR_VERSION 26 +#define DB_MINOR_VERSION 30 //! ## Timing subsystem diff --git a/code/__DEFINES/turfs.dm b/code/__DEFINES/turfs.dm index 295c09f6d46..cbd73aff899 100644 --- a/code/__DEFINES/turfs.dm +++ b/code/__DEFINES/turfs.dm @@ -104,3 +104,8 @@ * Finds the midpoint of two given turfs. */ #define TURF_MIDPOINT(a, b) (locate(((a.x + b.x) * 0.5), (a.y + b.y) * 0.5, (a.z + b.z) * 0.5)) + +/// Defines the x offset to apply to larger smoothing turfs (such as grass). +#define LARGE_TURF_SMOOTHING_X_OFFSET -9 +/// Defines the y offset to apply to larger smoothing turfs (such as grass). +#define LARGE_TURF_SMOOTHING_Y_OFFSET -9 diff --git a/code/__HELPERS/hallucinations.dm b/code/__HELPERS/hallucinations.dm index 1eeab08d876..edd65ee926a 100644 --- a/code/__HELPERS/hallucinations.dm +++ b/code/__HELPERS/hallucinations.dm @@ -145,7 +145,7 @@ ADMIN_VERB(debug_hallucination_weighted_list_per_type, R_DEBUG, "Show Hallucinat last_type_weight = this_weight // Sort by weight descending, where weight is the values (not the keys). We assoc_to_keys later to get JUST the text - all_weights = sortTim(all_weights, GLOBAL_PROC_REF(cmp_numeric_dsc), associative = TRUE) + sortTim(all_weights, GLOBAL_PROC_REF(cmp_numeric_dsc), associative = TRUE) var/page_style = "" var/page_contents = "[page_style][header][jointext(assoc_to_keys(all_weights), "")]
" diff --git a/code/__HELPERS/sorts/InsertSort.dm b/code/__HELPERS/sorts/InsertSort.dm deleted file mode 100644 index 2d5ca408ce3..00000000000 --- a/code/__HELPERS/sorts/InsertSort.dm +++ /dev/null @@ -1,19 +0,0 @@ -//simple insertion sort - generally faster than merge for runs of 7 or smaller -/proc/sortInsert(list/L, cmp=/proc/cmp_numeric_asc, associative, fromIndex=1, toIndex=0) - if(L && L.len >= 2) - fromIndex = fromIndex % L.len - toIndex = toIndex % (L.len+1) - if(fromIndex <= 0) - fromIndex += L.len - if(toIndex <= 0) - toIndex += L.len + 1 - - var/datum/sort_instance/SI = GLOB.sortInstance - if(!SI) - SI = new - SI.L = L - SI.cmp = cmp - SI.associative = associative - - SI.binarySort(fromIndex, toIndex, fromIndex) - return L diff --git a/code/__HELPERS/sorts/MergeSort.dm b/code/__HELPERS/sorts/MergeSort.dm deleted file mode 100644 index 4692534edff..00000000000 --- a/code/__HELPERS/sorts/MergeSort.dm +++ /dev/null @@ -1,19 +0,0 @@ -//merge-sort - gernerally faster than insert sort, for runs of 7 or larger -/proc/sortMerge(list/L, cmp=/proc/cmp_numeric_asc, associative, fromIndex=1, toIndex) - if(L && L.len >= 2) - fromIndex = fromIndex % L.len - toIndex = toIndex % (L.len+1) - if(fromIndex <= 0) - fromIndex += L.len - if(toIndex <= 0) - toIndex += L.len + 1 - - var/datum/sort_instance/SI = GLOB.sortInstance - if(!SI) - SI = new - SI.L = L - SI.cmp = cmp - SI.associative = associative - - SI.mergeSort(fromIndex, toIndex) - return L diff --git a/code/__HELPERS/sorts/TimSort.dm b/code/__HELPERS/sorts/TimSort.dm deleted file mode 100644 index 44f6d170df4..00000000000 --- a/code/__HELPERS/sorts/TimSort.dm +++ /dev/null @@ -1,20 +0,0 @@ -//TimSort interface -/proc/sortTim(list/L, cmp=/proc/cmp_numeric_asc, associative, fromIndex=1, toIndex=0) - if(L && L.len >= 2) - fromIndex = fromIndex % L.len - toIndex = toIndex % (L.len+1) - if(fromIndex <= 0) - fromIndex += L.len - if(toIndex <= 0) - toIndex += L.len + 1 - - var/datum/sort_instance/SI = GLOB.sortInstance - if(!SI) - SI = new - - SI.L = L - SI.cmp = cmp - SI.associative = associative - - SI.timSort(fromIndex, toIndex) - return L diff --git a/code/__HELPERS/sorts/helpers.dm b/code/__HELPERS/sorts/helpers.dm new file mode 100644 index 00000000000..7198286f29f --- /dev/null +++ b/code/__HELPERS/sorts/helpers.dm @@ -0,0 +1,95 @@ +/// Sorts the list in place with timSort, default settings. +#define SORT_TIM(to_sort, associative) if(length(to_sort) >= 2) { \ + var/datum/sort_instance/sorter = GLOB.sortInstance; \ + if (isnull(sorter)) { \ + sorter = new; \ + } \ + sorter.L = to_sort; \ + sorter.cmp = GLOBAL_PROC_REF(cmp_numeric_asc); \ + sorter.associative = associative; \ + sorter.timSort(1, 0); \ +} + + +/// Helper for the sorting procs. Prevents some code duplication. Creates /datum/sort_instance/sorter +#define CREATE_SORT_INSTANCE(to_sort, cmp, associative, fromIndex, toIndex) \ + if(length(to_sort) < 2) { \ + return to_sort; \ + } \ + fromIndex = fromIndex % length(to_sort); \ + toIndex = toIndex % (length(to_sort) + 1); \ + if (fromIndex <= 0) { \ + fromIndex += length(to_sort); \ + } \ + if (toIndex <= 0) { \ + toIndex += length(to_sort) + 1; \ + } \ + var/datum/sort_instance/sorter = GLOB.sortInstance; \ + if (isnull(sorter)) { \ + sorter = new; \ + } \ + sorter.L = to_sort; \ + sorter.cmp = cmp; \ + sorter.associative = associative; + + +/** + * ## Tim Sort + * Hybrid sorting algorithm derived from merge sort and insertion sort. + * + * **Sorts in place**. + * You might not need to get the return value. + * + * @see + * https://en.wikipedia.org/wiki/Timsort + * + * @param {list} to_sort - The list to sort. + * + * @param {proc} cmp - The comparison proc to use. Default: Numeric ascending. + * + * @param {boolean} associative - Whether the list is associative. Default: FALSE. + * + * @param {int} fromIndex - The index to start sorting from. Default: 1. + * + * @param {int} toIndex - The index to stop sorting at. Default: 0. + */ +/proc/sortTim(list/to_sort, cmp = GLOBAL_PROC_REF(cmp_numeric_asc), associative = FALSE, fromIndex = 1, toIndex = 0) as /list + CREATE_SORT_INSTANCE(to_sort, cmp, associative, fromIndex, toIndex) + + sorter.timSort(fromIndex, toIndex) + + return to_sort + + +/** + * ## Merge Sort + * Divide and conquer sorting algorithm. + * + * @see + * - https://en.wikipedia.org/wiki/Merge_sort + */ +/proc/sortMerge(list/to_sort, cmp = GLOBAL_PROC_REF(cmp_numeric_asc), associative = FALSE, fromIndex = 1, toIndex = 0) as /list + CREATE_SORT_INSTANCE(to_sort, cmp, associative, fromIndex, toIndex) + + sorter.mergeSort(fromIndex, toIndex) + + return to_sort + + +/** + * ## Insertion Sort + * Simple sorting algorithm that builds the final sorted list one item at a time. + * + + * @see + * - https://en.wikipedia.org/wiki/Insertion_sort + */ +/proc/sortInsert(list/to_sort, cmp = GLOBAL_PROC_REF(cmp_numeric_asc), associative = FALSE, fromIndex = 1, toIndex = 0) as /list + CREATE_SORT_INSTANCE(to_sort, cmp, associative, fromIndex, toIndex) + + sorter.binarySort(fromIndex, toIndex) + + return to_sort + + +#undef CREATE_SORT_INSTANCE diff --git a/code/__HELPERS/sorts/__main.dm b/code/__HELPERS/sorts/sort_instance.dm similarity index 100% rename from code/__HELPERS/sorts/__main.dm rename to code/__HELPERS/sorts/sort_instance.dm diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index b3ff39ef1fe..b2614e1b101 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -451,10 +451,13 @@ /datum/config_entry/flag/irc_first_connection_alert // do we notify the irc channel when somebody is connecting for the first time? +/datum/config_entry/string/ipintel_base + default = "check.getipintel.net" + /datum/config_entry/string/ipintel_email /datum/config_entry/string/ipintel_email/ValidateAndSet(str_val) - return str_val != "ch@nge.me" && ..() + return str_val != "ch@nge.me" && (!length(str_val) || findtext(str_val, "@")) && ..() /datum/config_entry/number/ipintel_rating_bad default = 1 @@ -462,18 +465,26 @@ min_val = 0 max_val = 1 -/datum/config_entry/number/ipintel_save_good - default = 12 - integer = FALSE +/datum/config_entry/flag/ipintel_reject_rate_limited + default = FALSE + +/datum/config_entry/flag/ipintel_reject_bad + default = FALSE + +/datum/config_entry/flag/ipintel_reject_unknown + default = FALSE + +/datum/config_entry/number/ipintel_rate_minute + default = 15 min_val = 0 -/datum/config_entry/number/ipintel_save_bad - default = 1 - integer = FALSE +/datum/config_entry/number/ipintel_cache_length + default = 7 min_val = 0 -/datum/config_entry/string/ipintel_domain - default = "check.getipintel.net" +/datum/config_entry/number/ipintel_exempt_playtime_living + default = 5 + min_val = 0 /datum/config_entry/flag/aggressive_changelog diff --git a/code/controllers/subsystem/dcs.dm b/code/controllers/subsystem/dcs.dm index eefbede3087..a3dcc26af54 100644 --- a/code/controllers/subsystem/dcs.dm +++ b/code/controllers/subsystem/dcs.dm @@ -84,7 +84,7 @@ PROCESSING_SUBSYSTEM_DEF(dcs) fullid += REF(key) if(named_arguments) - named_arguments = sortTim(named_arguments, GLOBAL_PROC_REF(cmp_text_asc)) + sortTim(named_arguments, GLOBAL_PROC_REF(cmp_text_asc)) fullid += named_arguments return list2params(fullid) diff --git a/code/controllers/subsystem/dynamic/dynamic_rulesets.dm b/code/controllers/subsystem/dynamic/dynamic_rulesets.dm index 8b45b129c99..0ca3c84bb68 100644 --- a/code/controllers/subsystem/dynamic/dynamic_rulesets.dm +++ b/code/controllers/subsystem/dynamic/dynamic_rulesets.dm @@ -140,28 +140,41 @@ /// This function is here to ensure the antag ratio is kept under control while scaling up. /// Returns how much threat to actually spend in the end. /datum/dynamic_ruleset/proc/scale_up(population, max_scale) + SHOULD_NOT_OVERRIDE(TRUE) if (!scaling_cost) return 0 var/antag_fraction = 0 - for(var/_ruleset in (SSdynamic.executed_rules + list(src))) // we care about the antags we *will* assign, too - var/datum/dynamic_ruleset/ruleset = _ruleset - antag_fraction += ((1 + ruleset.scaled_times) * ruleset.get_antag_cap(population)) / SSdynamic.roundstart_pop_ready + for(var/datum/dynamic_ruleset/ruleset as anything in (SSdynamic.executed_rules + list(src))) // we care about the antags we *will* assign, too + antag_fraction += ruleset.get_antag_cap_scaling_included(population) / SSdynamic.roundstart_pop_ready for(var/i in 1 to max_scale) if(antag_fraction < 0.25) scaled_times += 1 - antag_fraction += get_antag_cap(population) / SSdynamic.roundstart_pop_ready // we added new antags, gotta update the % + antag_fraction += get_scaling_antag_cap(population) / SSdynamic.roundstart_pop_ready // we added new antags, gotta update the % return scaled_times * scaling_cost +/// Returns how many more antags to add while scaling with a given population. +/// By default rulesets scale linearly, but you can override this to make them scale differently. +/datum/dynamic_ruleset/proc/get_scaling_antag_cap(population) + return get_antag_cap(population) + /// Returns what the antag cap with the given population is. /datum/dynamic_ruleset/proc/get_antag_cap(population) + SHOULD_NOT_OVERRIDE(TRUE) if (isnum(antag_cap)) return antag_cap return CEILING(population / antag_cap["denominator"], 1) + (antag_cap["offset"] || 0) +/// Gets the 'final' antag cap for this ruleset, which is the base cap plus the scaled cap. +/datum/dynamic_ruleset/proc/get_antag_cap_scaling_included(population) + SHOULD_NOT_OVERRIDE(TRUE) + var/base_cap = get_antag_cap(population) + var/modded_cap = scaled_times * get_scaling_antag_cap(population) + return base_cap + modded_cap + /// This is called if persistent variable is true everytime SSTicker ticks. /datum/dynamic_ruleset/proc/rule_process() return diff --git a/code/controllers/subsystem/dynamic/dynamic_rulesets_roundstart.dm b/code/controllers/subsystem/dynamic/dynamic_rulesets_roundstart.dm index 04650824b3d..cf72ccc6411 100644 --- a/code/controllers/subsystem/dynamic/dynamic_rulesets_roundstart.dm +++ b/code/controllers/subsystem/dynamic/dynamic_rulesets_roundstart.dm @@ -33,8 +33,7 @@ GLOBAL_VAR_INIT(revolutionary_win, FALSE) /datum/dynamic_ruleset/roundstart/traitor/pre_execute(population) . = ..() - var/num_traitors = get_antag_cap(population) * (scaled_times + 1) - for (var/i = 1 to num_traitors) + for (var/i in 1 to get_antag_cap_scaling_included(population)) if(candidates.len <= 0) break var/mob/M = pick_n_take(candidates) @@ -121,7 +120,7 @@ GLOBAL_VAR_INIT(revolutionary_win, FALSE) /datum/dynamic_ruleset/roundstart/traitorbro/pre_execute(population) . = ..() - for (var/_ in 1 to get_antag_cap(population) * (scaled_times + 1)) + for (var/i in 1 to get_antag_cap_scaling_included(population)) var/mob/candidate = pick_n_take(candidates) if (isnull(candidate)) break @@ -135,10 +134,7 @@ GLOBAL_VAR_INIT(revolutionary_win, FALSE) /datum/dynamic_ruleset/roundstart/traitorbro/execute() for (var/datum/mind/mind in assigned) - var/datum/team/brother_team/team = new - team.add_member(mind) - team.forge_brother_objectives() - mind.add_antag_datum(/datum/antagonist/brother, team) + new /datum/team/brother_team(mind) GLOB.pre_setup_antags -= mind return TRUE @@ -174,8 +170,7 @@ GLOBAL_VAR_INIT(revolutionary_win, FALSE) /datum/dynamic_ruleset/roundstart/changeling/pre_execute(population) . = ..() - var/num_changelings = get_antag_cap(population) * (scaled_times + 1) - for (var/i = 1 to num_changelings) + for (var/i in 1 to get_antag_cap_scaling_included(population)) if(candidates.len <= 0) break var/mob/M = pick_n_take(candidates) @@ -721,13 +716,15 @@ GLOBAL_VAR_INIT(revolutionary_win, FALSE) required_candidates = 3 // lives or dies by there being a few spies weight = 5 cost = 8 - scaling_cost = 101 // see below - minimum_players = 8 - antag_cap = list("denominator" = 8, "offset" = 1) // should have quite a few spies to work against each other + scaling_cost = 4 + minimum_players = 10 + antag_cap = list("denominator" = 20, "offset" = 1) requirements = list(8, 8, 8, 8, 8, 8, 8, 8, 8, 8) + /// What fraction is added to the antag cap for each additional scale + var/fraction_per_scale = 0.2 /datum/dynamic_ruleset/roundstart/spies/pre_execute(population) - for(var/i in 1 to get_antag_cap(population) * (scaled_times + 1)) + for(var/i in 1 to get_antag_cap_scaling_included(population)) if(length(candidates) <= 0) break var/mob/picked_player = pick_n_take(candidates) @@ -737,7 +734,6 @@ GLOBAL_VAR_INIT(revolutionary_win, FALSE) GLOB.pre_setup_antags += picked_player.mind return TRUE -/datum/dynamic_ruleset/roundstart/spies/scale_up(population, max_scale) - // Disabled (at least until dynamic can handle scaling this better) - // Because spies have a very low demoninator, this can easily spawn like 30 of them - return 0 +// Scaling adds a fraction of the amount of additional spies rather than the full amount. +/datum/dynamic_ruleset/roundstart/spies/get_scaling_antag_cap(population) + return ceil(..() * fraction_per_scale) diff --git a/code/controllers/subsystem/ipintel.dm b/code/controllers/subsystem/ipintel.dm index 83cbbc4c27e..f49ad56fca5 100644 --- a/code/controllers/subsystem/ipintel.dm +++ b/code/controllers/subsystem/ipintel.dm @@ -1,13 +1,295 @@ SUBSYSTEM_DEF(ipintel) name = "XKeyScore" init_order = INIT_ORDER_XKEYSCORE - flags = SS_NO_FIRE - var/enabled = FALSE //disable at round start to avoid checking reconnects - var/throttle = 0 - var/errors = 0 + flags = SS_NO_INIT|SS_NO_FIRE + /// The threshold for probability to be considered a VPN and/or bad IP + var/probability_threshold - var/list/cache = list() + /// Cache for previously queried IP addresses and those stored in the database + var/list/datum/ip_intel/cached_queries = list() + /// The store for rate limiting + var/list/rate_limit_minute -/datum/controller/subsystem/ipintel/Initialize() - enabled = TRUE - return SS_INIT_SUCCESS +/// The ip intel for a given address +/datum/ip_intel + /// If this intel was just queried, the status of the query + var/query_status + var/result + var/address + var/date + +/datum/controller/subsystem/ipintel/OnConfigLoad() + var/list/fail_messages = list() + + var/contact_email = CONFIG_GET(string/ipintel_email) + + if(!length(contact_email)) + fail_messages += "No contact email" + + if(!findtext(contact_email, "@")) + fail_messages += "Invalid contact email" + + if(!length(CONFIG_GET(string/ipintel_base))) + fail_messages += "Invalid query base" + + if (!CONFIG_GET(flag/sql_enabled)) + fail_messages += "The database is not enabled" + + if(length(fail_messages)) + message_admins("IPIntel: Initialization failed check logs!") + logger.Log(LOG_CATEGORY_GAME_ACCESS, "IPIntel is not enabled because the configs are not valid.", list( + "fail_messages" = fail_messages, + )) + +/datum/controller/subsystem/ipintel/stat_entry(msg) + return "[..()] | M: [CONFIG_GET(number/ipintel_rate_minute) - rate_limit_minute]" + + +/datum/controller/subsystem/ipintel/proc/is_enabled() + return length(CONFIG_GET(string/ipintel_email)) && length(CONFIG_GET(string/ipintel_base)) && CONFIG_GET(flag/sql_enabled) + +/datum/controller/subsystem/ipintel/proc/get_address_intel_state(address, probability_override) + if (!is_enabled()) + return IPINTEL_GOOD_IP + var/datum/ip_intel/intel = query_address(address) + if(isnull(intel)) + stack_trace("query_address did not return an ip intel response") + return IPINTEL_UNKNOWN_INTERNAL_ERROR + + if(istext(intel)) + return intel + + if(!(intel.query_status in list("success", "cached"))) + return IPINTEL_UNKNOWN_QUERY_ERROR + var/check_probability = probability_override || CONFIG_GET(number/ipintel_rating_bad) + if(intel.result >= check_probability) + return IPINTEL_BAD_IP + return IPINTEL_GOOD_IP + +/datum/controller/subsystem/ipintel/proc/is_rate_limited() + var/static/minute_key + var/expected_minute_key = floor(REALTIMEOFDAY / 1 MINUTES) + + if(minute_key != expected_minute_key) + minute_key = expected_minute_key + rate_limit_minute = 0 + + if(rate_limit_minute >= CONFIG_GET(number/ipintel_rate_minute)) + return IPINTEL_RATE_LIMITED_MINUTE + return FALSE + +/datum/controller/subsystem/ipintel/proc/query_address(address, allow_cached = TRUE) + if (!is_enabled()) + return + if(allow_cached && fetch_cached_ip_intel(address)) + return cached_queries[address] + var/is_rate_limited = is_rate_limited() + if(is_rate_limited) + return is_rate_limited + rate_limit_minute += 1 + + var/query_base = "https://[CONFIG_GET(string/ipintel_base)]/check.php?ip=" + var/query = "[query_base][address]&contact=[CONFIG_GET(string/ipintel_email)]&flags=b&format=json" + + var/datum/http_request/request = new + request.prepare(RUSTG_HTTP_METHOD_GET, query) + request.execute_blocking() + var/datum/http_response/response = request.into_response() + var/list/data = json_decode(response.body) + // Log the response + logger.Log(LOG_CATEGORY_DEBUG, "ip check response body", data) + + var/datum/ip_intel/intel = new + intel.query_status = data["status"] + if(intel.query_status != "success") + return intel + intel.result = data["result"] + if(istext(intel.result)) + intel.result = text2num(intel.result) + intel.date = SQLtime() + intel.address = address + cached_queries[address] = intel + add_intel_to_database(intel) + return intel + +/datum/controller/subsystem/ipintel/proc/add_intel_to_database(datum/ip_intel/intel) + set waitfor = FALSE //no need to make the client connection wait for this step. + if (!SSdbcore.Connect()) + return + var/datum/db_query/query = SSdbcore.NewQuery( + "INSERT INTO [format_table_name("ipintel")] ( \ + ip, \ + intel \ + ) VALUES ( \ + INET_ATON(:address), \ + :result \ + )", list( + "address" = intel.address, + "result" = intel.result, + ) + ) + query.warn_execute() + query.sync() + qdel(query) + +/datum/controller/subsystem/ipintel/proc/fetch_cached_ip_intel(address) + if (!SSdbcore.Connect()) + return + var/ipintel_cache_length = CONFIG_GET(number/ipintel_cache_length) + var/date_restrictor = "" + var/sql_args = list("address" = address) + if(ipintel_cache_length > 1) + date_restrictor = " AND date > DATE_SUB(NOW(), INTERVAL :ipintel_cache_length DAY)" + sql_args["ipintel_cache_length"] = ipintel_cache_length + var/datum/db_query/query = SSdbcore.NewQuery( + "SELECT * FROM [format_table_name("ipintel")] WHERE ip = INET_ATON(:address)[date_restrictor]", + sql_args + ) + query.warn_execute() + query.sync() + if(query.status == DB_QUERY_BROKEN) + qdel(query) + return null + + query.NextRow() + var/list/data = query.item + qdel(query) + if(isnull(data)) + return null + + var/datum/ip_intel/intel = new + intel.query_status = "cached" + intel.result = data["intel"] + if(istext(intel.result)) + intel.result = text2num(intel.result) + intel.date = data["date"] + intel.address = address + return TRUE + +/datum/controller/subsystem/ipintel/proc/is_exempt(client/player) + if(player.holder || GLOB.deadmins[player.ckey]) + return TRUE + var/exempt_living_playtime = CONFIG_GET(number/ipintel_exempt_playtime_living) + if(exempt_living_playtime > 0) + var/list/play_records = player.prefs.exp + if (!play_records.len) + player.set_exp_from_db() + play_records = player.prefs.exp + if(length(play_records) && play_records[EXP_TYPE_LIVING] > exempt_living_playtime) + return TRUE + return FALSE + +/datum/controller/subsystem/ipintel/proc/is_whitelisted(ckey) + var/datum/db_query/query = SSdbcore.NewQuery( + "SELECT * FROM [format_table_name("ipintel_whitelist")] WHERE ckey = :ckey", list( + "ckey" = ckey + ) + ) + query.warn_execute() + query.sync() + if(query.status == DB_QUERY_BROKEN) + qdel(query) + return FALSE + query.NextRow() + . = !!query.item // if they have a row, they are whitelisted + qdel(query) + + +ADMIN_VERB(ipintel_allow, R_BAN, "Whitelist Player VPN", "Allow a player to connect even if they are using a VPN.", ADMIN_CATEGORY_IPINTEL, ckey as text) + if (!SSipintel.is_enabled()) + to_chat(user, "The ipintel system is not currently enabled but you can still edit the whitelists") + if(SSipintel.is_whitelisted(ckey)) + to_chat(user, "Player is already whitelisted.") + return + + var/datum/db_query/query = SSdbcore.NewQuery( + "INSERT INTO [format_table_name("ipintel_whitelist")] ( \ + ckey, \ + admin_ckey \ + ) VALUES ( \ + :ckey, \ + :admin_ckey \ + )", list( + "ckey" = ckey, + "admin_ckey" = user.ckey, + ) + ) + query.warn_execute() + query.sync() + qdel(query) + message_admins("IPINTEL: [key_name_admin(user)] has whitelisted '[ckey]'") + +ADMIN_VERB(ipintel_revoke, R_BAN, "Revoke Player VPN Whitelist", "Revoke a player's VPN whitelist.", ADMIN_CATEGORY_IPINTEL, ckey as text) + if (!SSipintel.is_enabled()) + to_chat(user, "The ipintel system is not currently enabled but you can still edit the whitelists") + if(!SSipintel.is_whitelisted(ckey)) + to_chat(user, "Player is not whitelisted.") + return + var/datum/db_query/query = SSdbcore.NewQuery( + "DELETE FROM [format_table_name("ipintel_whitelist")] WHERE ckey = :ckey", list( + "ckey" = ckey + ) + ) + query.warn_execute() + query.sync() + qdel(query) + message_admins("IPINTEL: [key_name_admin(user)] has revoked the VPN whitelist for '[ckey]'") + +/client/proc/check_ip_intel() + if (!SSipintel.is_enabled()) + return + if(SSipintel.is_exempt(src) || SSipintel.is_whitelisted(ckey)) + return + + var/intel_state = SSipintel.get_address_intel_state(address) + var/reject_bad_intel = CONFIG_GET(flag/ipintel_reject_bad) + var/reject_unknown_intel = CONFIG_GET(flag/ipintel_reject_unknown) + var/reject_rate_limited = CONFIG_GET(flag/ipintel_reject_rate_limited) + + var/connection_rejected = FALSE + var/datum/ip_intel/intel = SSipintel.cached_queries[address] + switch(intel_state) + if(IPINTEL_BAD_IP) + log_access("IPINTEL: [ckey] was flagged as a VPN with [intel.result * 100]% likelihood.") + if(reject_bad_intel) + to_chat_immediate(src, span_boldnotice("Your connection has been detected as a VPN.")) + connection_rejected = TRUE + else + message_admins("IPINTEL: [key_name_admin(src)] has been flagged as a VPN with [intel.result * 100]% likelihood.") + + if(IPINTEL_RATE_LIMITED_DAY, IPINTEL_RATE_LIMITED_MINUTE) + log_access("IPINTEL: [ckey] was unable to be checked due to the rate limit.") + if(reject_rate_limited) + to_chat_immediate(src, span_boldnotice("New connections are not being allowed at this time.")) + connection_rejected = TRUE + else + message_admins("IPINTEL: [key_name_admin(src)] was unable to be checked due to rate limiting.") + + if(IPINTEL_UNKNOWN_INTERNAL_ERROR, IPINTEL_UNKNOWN_QUERY_ERROR) + log_access("IPINTEL: [ckey] unable to be checked due to an error.") + if(reject_unknown_intel) + to_chat_immediate(src, span_boldnotice("Your connection cannot be processed at this time.")) + connection_rejected = TRUE + else + message_admins("IPINTEL: [key_name_admin(src)] was unable to be checked due to an error.") + + if(!connection_rejected) + return + + var/list/contact_where = list() + var/forum_url = CONFIG_GET(string/forumurl) + if(forum_url) + contact_where += list("Forums") + var/appeal_url = CONFIG_GET(string/banappeals) + if(appeal_url) + contact_where += list("Ban Appeals") + + var/message_string = "Your connection has been rejected at this time. If you believe this is in error or have any questions please contact an admin" + if(length(contact_where)) + message_string += " at [english_list(contact_where)]" + else + message_string += " somehow." + message_string += "." + + to_chat_immediate(src, span_userdanger(message_string)) + qdel(src) diff --git a/code/controllers/subsystem/lua.dm b/code/controllers/subsystem/lua.dm index b9ad7dc1644..1ab88a01746 100644 --- a/code/controllers/subsystem/lua.dm +++ b/code/controllers/subsystem/lua.dm @@ -53,7 +53,7 @@ SUBSYSTEM_DEF(lua) world.SetConfig("env", "LUAU_PATH", jointext(lua_path, ";")) /datum/controller/subsystem/lua/Shutdown() - AUXTOOLS_SHUTDOWN(AUXLUA) + AUXTOOLS_FULL_SHUTDOWN(AUXLUA) /datum/controller/subsystem/lua/proc/queue_resume(datum/lua_state/state, index, arguments) if(!initialized) diff --git a/code/controllers/subsystem/materials.dm b/code/controllers/subsystem/materials.dm index b4664323eeb..3a704d01a82 100644 --- a/code/controllers/subsystem/materials.dm +++ b/code/controllers/subsystem/materials.dm @@ -21,15 +21,15 @@ SUBSYSTEM_DEF(materials) var/list/list/material_combos ///List of stackcrafting recipes for materials using base recipes var/list/base_stack_recipes = list( - new /datum/stack_recipe("Chair", /obj/structure/chair/greyscale, one_per_turf = TRUE, on_solid_ground = TRUE, applies_mats = TRUE, category = CAT_FURNITURE), - new /datum/stack_recipe("Toilet", /obj/structure/toilet/greyscale, one_per_turf = TRUE, on_solid_ground = TRUE, applies_mats = TRUE, category = CAT_FURNITURE), - new /datum/stack_recipe("Sink Frame", /obj/structure/sinkframe, one_per_turf = TRUE, on_solid_ground = TRUE, applies_mats = TRUE, category = CAT_FURNITURE), - new /datum/stack_recipe("Material floor tile", /obj/item/stack/tile/material, 1, 4, 20, applies_mats = TRUE, check_density = FALSE, category = CAT_TILES), - new /datum/stack_recipe("Material airlock assembly", /obj/structure/door_assembly/door_assembly_material, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, applies_mats = TRUE, category = CAT_DOORS), + new /datum/stack_recipe("Chair", /obj/structure/chair/greyscale, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND | CRAFT_APPLIES_MATS, category = CAT_FURNITURE), + new /datum/stack_recipe("Toilet", /obj/structure/toilet/greyscale, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND | CRAFT_APPLIES_MATS, category = CAT_FURNITURE), + new /datum/stack_recipe("Sink Frame", /obj/structure/sinkframe, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND | CRAFT_APPLIES_MATS, category = CAT_FURNITURE), + new /datum/stack_recipe("Material floor tile", /obj/item/stack/tile/material, 1, 4, 20, crafting_flags = CRAFT_APPLIES_MATS, category = CAT_TILES), + new /datum/stack_recipe("Material airlock assembly", /obj/structure/door_assembly/door_assembly_material, 4, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND | CRAFT_APPLIES_MATS, category = CAT_DOORS), ) ///List of stackcrafting recipes for materials using rigid recipes var/list/rigid_stack_recipes = list( - new /datum/stack_recipe("Carving block", /obj/structure/carving_block, 5, time = 3 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, applies_mats = TRUE, category = CAT_STRUCTURE), + new /datum/stack_recipe("Carving block", /obj/structure/carving_block, 5, time = 3 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND | CRAFT_APPLIES_MATS, category = CAT_STRUCTURE), ) ///A list of dimensional themes used by the dimensional anomaly and other things, most of which require materials to function. diff --git a/code/datums/ai/_ai_controller.dm b/code/datums/ai/_ai_controller.dm index 35615c6704c..1a981f90aed 100644 --- a/code/datums/ai/_ai_controller.dm +++ b/code/datums/ai/_ai_controller.dm @@ -235,9 +235,10 @@ multiple modular subtrees with behaviors ///Called when the AI controller pawn changes z levels, we check if there's any clients on the new one and wake up the AI if there is. /datum/ai_controller/proc/on_changed_z_level(atom/source, turf/old_turf, turf/new_turf, same_z_layer, notify_contents) SIGNAL_HANDLER - var/mob/mob_pawn = pawn - if((mob_pawn?.client && !continue_processing_when_client)) - return + if (ismob(pawn)) + var/mob/mob_pawn = pawn + if((mob_pawn?.client && !continue_processing_when_client)) + return if(old_turf) SSai_controllers.ai_controllers_by_zlevel[old_turf.z] -= src if(new_turf) diff --git a/code/datums/components/crafting/_recipes.dm b/code/datums/components/crafting/_recipes.dm index 09121339d30..31825ac6611 100644 --- a/code/datums/components/crafting/_recipes.dm +++ b/code/datums/components/crafting/_recipes.dm @@ -23,14 +23,12 @@ var/list/chem_catalysts = list() ///where it shows up in the crafting UI var/category - ///Set to FALSE if it needs to be learned first. - var/always_available = TRUE ///Required machines for the craft, set the assigned value of the typepath to CRAFTING_MACHINERY_CONSUME or CRAFTING_MACHINERY_USE. Lazy associative list: type_path key -> flag value. var/list/machinery ///Required structures for the craft, set the assigned value of the typepath to CRAFTING_STRUCTURE_CONSUME or CRAFTING_STRUCTURE_USE. Lazy associative list: type_path key -> flag value. var/list/structures - ///Should only one object exist on the same turf? - var/one_per_turf = FALSE + /// Bitflag of additional placement checks required to place. (STACK_CHECK_CARDINALS|STACK_CHECK_ADJACENT|STACK_CHECK_TRAM_FORBIDDEN|STACK_CHECK_TRAM_EXCLUSIVE) + var/placement_checks = NONE /// Steps needed to achieve the result var/list/steps /// Whether the result can be crafted with a crafting menu button @@ -44,6 +42,9 @@ /// Allows you to craft so that you don't have to click the craft button many times. var/mass_craftable = FALSE + ///crafting_flags var to hold bool values + var/crafting_flags = CRAFT_CHECK_DENSITY + /datum/crafting_recipe/New() if(!name && result) var/atom/atom_result = result @@ -83,6 +84,7 @@ src.result_amount = stack_recipe.res_amount src.reqs[material] = stack_recipe.req_amount src.category = stack_recipe.category || CAT_MISC + src.placement_checks = stack_recipe.placement_checks /** * Run custom pre-craft checks for this recipe, don't add feedback messages in this because it will spam the client diff --git a/code/datums/components/crafting/atmospheric.dm b/code/datums/components/crafting/atmospheric.dm index cb5bba9ab52..b2993012e82 100644 --- a/code/datums/components/crafting/atmospheric.dm +++ b/code/datums/components/crafting/atmospheric.dm @@ -25,7 +25,7 @@ /obj/item/assembly/igniter = 1, ) blacklist = list(/obj/item/assembly/igniter/condenser) - one_per_turf = TRUE + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF time = 2 SECONDS category = CAT_ATMOSPHERIC diff --git a/code/datums/components/crafting/crafting.dm b/code/datums/components/crafting/crafting.dm index 6fc560a293f..7a56f89c8e9 100644 --- a/code/datums/components/crafting/crafting.dm +++ b/code/datums/components/crafting/crafting.dm @@ -191,42 +191,86 @@ var/list/contents = get_surroundings(crafter, recipe.blacklist) var/send_feedback = 1 - if(check_contents(crafter, recipe, contents)) - if(check_tools(crafter, recipe, contents)) - if(recipe.one_per_turf) - for(var/content in get_turf(crafter)) - if(istype(content, recipe.result)) - return ", object already present." - //If we're a mob we'll try a do_after; non mobs will instead instantly construct the item - if(ismob(crafter) && !do_after(crafter, recipe.time, target = crafter)) - return "." - contents = get_surroundings(crafter, recipe.blacklist) - if(!check_contents(crafter, recipe, contents)) - return ", missing component." - if(!check_tools(crafter, recipe, contents)) - return ", missing tool." - var/list/parts = del_reqs(recipe, crafter) - var/atom/movable/result - if(ispath(recipe.result, /obj/item/stack)) - result = new recipe.result(get_turf(crafter.loc), recipe.result_amount || 1) - else - result = new recipe.result(get_turf(crafter.loc)) - if(result.atom_storage && recipe.delete_contents) - for(var/obj/item/thing in result) - qdel(thing) - var/datum/reagents/holder = locate() in parts - if(holder) //transfer reagents from ingredients to result - 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) - result.CheckParts(parts, recipe) - if(send_feedback) - SSblackbox.record_feedback("tally", "object_crafted", 1, result.type) - return result //Send the item back to whatever called this proc so it can handle whatever it wants to do with the new item + var/turf/dest_turf = get_turf(crafter) + + if(!check_contents(crafter, recipe, contents)) + return ", missing component." + + if(!check_tools(crafter, recipe, contents)) return ", missing tool." - return ", missing component." + + + + if((recipe.crafting_flags & CRAFT_ONE_PER_TURF) && (locate(recipe.result) in dest_turf)) + return ", already one here!" + + if(recipe.crafting_flags & CRAFT_CHECK_DIRECTION) + if(!valid_build_direction(dest_turf, crafter.dir, is_fulltile = (recipe.crafting_flags & CRAFT_IS_FULLTILE))) + return ", won't fit here!" + + if(recipe.crafting_flags & CRAFT_ON_SOLID_GROUND) + if(isclosedturf(dest_turf)) + return ", cannot be made on a wall!" + + if(is_type_in_typecache(dest_turf, GLOB.turfs_without_ground)) + if(!locate(/obj/structure/thermoplastic) in dest_turf) // for tram construction + return ", must be made on solid ground!" + + if(recipe.crafting_flags & CRAFT_CHECK_DENSITY) + for(var/obj/object in dest_turf) + if(object.density && !(object.obj_flags & IGNORE_DENSITY) || object.obj_flags & BLOCKS_CONSTRUCTION) + return ", something is in the way!" + + if(recipe.placement_checks & STACK_CHECK_CARDINALS) + var/turf/nearby_turf + for(var/direction in GLOB.cardinals) + nearby_turf = get_step(dest_turf, direction) + if(locate(recipe.result) in nearby_turf) + to_chat(crafter, span_warning("\The [recipe.name] must not be built directly adjacent to another!")) + return ", can't be adjacent to another!" + + if(recipe.placement_checks & STACK_CHECK_ADJACENT) + if(locate(recipe.result) in range(1, dest_turf)) + return ", can't be near another!" + + if(recipe.placement_checks & STACK_CHECK_TRAM_FORBIDDEN) + if(locate(/obj/structure/transport/linear/tram) in dest_turf || locate(/obj/structure/thermoplastic) in dest_turf) + return ", can't be on tram!" + + if(recipe.placement_checks & STACK_CHECK_TRAM_EXCLUSIVE) + if(!locate(/obj/structure/transport/linear/tram) in dest_turf) + return ", must be made on a tram!" + + //If we're a mob we'll try a do_after; non mobs will instead instantly construct the item + if(ismob(crafter) && !do_after(crafter, recipe.time, target = crafter)) + return "." + contents = get_surroundings(crafter, recipe.blacklist) + if(!check_contents(crafter, recipe, contents)) + return ", missing component." + if(!check_tools(crafter, recipe, contents)) + return ", missing tool." + var/list/parts = del_reqs(recipe, crafter) + var/atom/movable/result + if(ispath(recipe.result, /obj/item/stack)) + result = new recipe.result(get_turf(crafter.loc), recipe.result_amount || 1) + result.dir = crafter.dir + else + result = new recipe.result(get_turf(crafter.loc)) + result.dir = crafter.dir + if(result.atom_storage && recipe.delete_contents) + for(var/obj/item/thing in result) + qdel(thing) + var/datum/reagents/holder = locate() in parts + if(holder) //transfer reagents from ingredients to result + 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) + result.CheckParts(parts, recipe) + if(send_feedback) + SSblackbox.record_feedback("tally", "object_crafted", 1, result.type) + return result //Send the item back to whatever called this proc so it can handle whatever it wants to do with the new item /*Del reqs works like this: @@ -369,7 +413,7 @@ qdel(DL) /datum/component/personal_crafting/proc/is_recipe_available(datum/crafting_recipe/recipe, mob/user) - if(!recipe.always_available && !(recipe.type in user?.mind?.learned_recipes)) //User doesn't actually know how to make this. + if((recipe.crafting_flags & CRAFT_MUST_BE_LEARNED) && !(recipe.type in user?.mind?.learned_recipes)) //User doesn't actually know how to make this. return FALSE if (recipe.category == CAT_CULT && !IS_CULTIST(user)) // Skip blood cult recipes if not cultist return FALSE diff --git a/code/datums/components/crafting/doors.dm b/code/datums/components/crafting/doors.dm index e8fcb3fdfd9..d9ed708904e 100644 --- a/code/datums/components/crafting/doors.dm +++ b/code/datums/components/crafting/doors.dm @@ -9,7 +9,7 @@ tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_MULTITOOL, TOOL_WIRECUTTER, TOOL_WELDER) time = 10 SECONDS category = CAT_DOORS - one_per_turf = TRUE + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF /datum/crafting_recipe/blast_doors name = "Blast Door" @@ -22,4 +22,4 @@ tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_MULTITOOL, TOOL_WIRECUTTER, TOOL_WELDER) time = 30 SECONDS category = CAT_DOORS - one_per_turf = TRUE + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF diff --git a/code/datums/components/crafting/melee_weapon.dm b/code/datums/components/crafting/melee_weapon.dm index 869d223a758..1c4150585fc 100644 --- a/code/datums/components/crafting/melee_weapon.dm +++ b/code/datums/components/crafting/melee_weapon.dm @@ -144,7 +144,6 @@ /datum/crafting_recipe/house_edge name = "House Edge" result = /obj/item/house_edge - always_available = FALSE tool_behaviors = list(TOOL_WRENCH, TOOL_SCREWDRIVER, TOOL_WELDER) reqs = list( /obj/item/v8_engine = 1, @@ -157,6 +156,7 @@ ) time = 10 SECONDS category = CAT_WEAPON_MELEE + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED /datum/crafting_recipe/giant_wrench name = "Big Slappy" diff --git a/code/datums/components/crafting/misc.dm b/code/datums/components/crafting/misc.dm index 264ff981565..606cf1fc292 100644 --- a/code/datums/components/crafting/misc.dm +++ b/code/datums/components/crafting/misc.dm @@ -11,8 +11,8 @@ time = 3 SECONDS reqs = list(/obj/item/stack/sheet/bone = 5) result = /obj/item/skeleton_key - always_available = FALSE category = CAT_MISC + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED /datum/crafting_recipe/coffee_cartridge name = "Bootleg Coffee Cartridge" diff --git a/code/datums/components/crafting/ranged_weapon.dm b/code/datums/components/crafting/ranged_weapon.dm index ace9f2c7c8b..88b721d3cb6 100644 --- a/code/datums/components/crafting/ranged_weapon.dm +++ b/code/datums/components/crafting/ranged_weapon.dm @@ -181,15 +181,33 @@ /datum/crafting_recipe/pipegun name = "Pipegun" result = /obj/item/gun/ballistic/rifle/boltaction/pipegun - reqs = list(/obj/item/weaponcrafting/receiver = 1, - /obj/item/pipe = 1, + reqs = list( + /obj/item/weaponcrafting/receiver = 1, + /obj/item/pipe = 2, /obj/item/weaponcrafting/stock = 1, + /obj/item/storage/toolbox = 1, // for the screws /obj/item/stack/sticky_tape = 1, ) tool_behaviors = list(TOOL_SCREWDRIVER) time = 5 SECONDS category = CAT_WEAPON_RANGED +/datum/crafting_recipe/pipepistol + name = "Pipe Pistol" + result = /obj/item/gun/ballistic/rifle/boltaction/pipegun/pistol + reqs = list( + /obj/item/weaponcrafting/receiver = 1, + /obj/item/pipe = 1, + /obj/item/stock_parts/servo = 2, + /obj/item/stack/sheet/mineral/wood = 4, + /obj/item/storage/toolbox = 1, // for the screws + /obj/item/stack/sticky_tape = 1, + ) + tool_paths = list(/obj/item/hatchet) + tool_behaviors = list(TOOL_SCREWDRIVER) + time = 5 SECONDS + category = CAT_WEAPON_RANGED + /datum/crafting_recipe/rebarxbow name = "Heated Rebar Crossbow" result = /obj/item/gun/ballistic/rifle/rebarxbow @@ -222,7 +240,6 @@ /datum/crafting_recipe/pipegun_prime name = "Regal Pipegun" - always_available = FALSE result = /obj/item/gun/ballistic/rifle/boltaction/pipegun/prime reqs = list( /obj/item/gun/ballistic/rifle/boltaction/pipegun = 1, @@ -230,15 +247,16 @@ /datum/reagent/consumable/grey_bull = 20, /obj/item/spear = 1, /obj/item/storage/toolbox = 1, + /obj/item/clothing/head/costume/crown = 1, // Any ol' crown will do ) tool_behaviors = list(TOOL_SCREWDRIVER) tool_paths = list(/obj/item/clothing/gloves/color/yellow, /obj/item/clothing/mask/gas, /obj/item/melee/baton/security/cattleprod) - time = 30 SECONDS //contemplate for a bit + time = 15 SECONDS //contemplate for a bit category = CAT_WEAPON_RANGED + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED /datum/crafting_recipe/deagle_prime //When you factor in the makarov (7 tc), the toolbox (1 tc), and the emag (3 tc), this comes to a total of 18 TC or thereabouts. Igorning the 20k pricetag, obviously. name = "Regal Condor" - always_available = FALSE result = /obj/item/gun/ballistic/automatic/pistol/deagle/regal reqs = list( /obj/item/gun/ballistic/automatic/pistol = 1, @@ -258,6 +276,7 @@ ) time = 30 SECONDS category = CAT_WEAPON_RANGED + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED /datum/crafting_recipe/deagle_prime/New() ..() @@ -265,7 +284,6 @@ /datum/crafting_recipe/deagle_prime_mag name = "Regal Condor Magazine (10mm Reaper)" - always_available = FALSE result = /obj/item/ammo_box/magazine/r10mm reqs = list( /obj/item/stack/sheet/iron = 10, @@ -283,10 +301,10 @@ ) time = 5 SECONDS category = CAT_WEAPON_RANGED + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED /datum/crafting_recipe/trash_cannon name = "Trash Cannon" - always_available = FALSE tool_behaviors = list(TOOL_WELDER, TOOL_SCREWDRIVER) result = /obj/structure/cannon/trash reqs = list( @@ -297,6 +315,7 @@ /obj/item/storage/toolbox = 1, ) category = CAT_WEAPON_RANGED + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED /datum/crafting_recipe/laser_musket name = "Laser Musket" @@ -316,7 +335,6 @@ /datum/crafting_recipe/laser_musket_prime name = "Heroic Laser Musket" - always_available = FALSE result = /obj/item/gun/energy/laser/musket/prime reqs = list( /obj/item/gun/energy/laser/musket = 1, @@ -329,6 +347,7 @@ tool_paths = list(/obj/item/clothing/head/cowboy, /obj/item/clothing/shoes/cowboy) time = 30 SECONDS //contemplate for a bit category = CAT_WEAPON_RANGED + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED /datum/crafting_recipe/smoothbore_disabler name = "Smoothbore Disabler" @@ -347,7 +366,6 @@ /datum/crafting_recipe/smoothbore_disabler_prime name = "Elite Smoothbore Disabler" - always_available = FALSE result = /obj/item/gun/energy/disabler/smoothbore/prime reqs = list( /obj/item/gun/energy/disabler/smoothbore = 1, @@ -358,3 +376,4 @@ tool_behaviors = list(TOOL_SCREWDRIVER) time = 20 SECONDS category = CAT_WEAPON_RANGED + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED diff --git a/code/datums/components/crafting/structures.dm b/code/datums/components/crafting/structures.dm index 2cbe2c35302..c4a9b48ec36 100644 --- a/code/datums/components/crafting/structures.dm +++ b/code/datums/components/crafting/structures.dm @@ -11,33 +11,33 @@ /datum/crafting_recipe/rib name = "Colossal Rib" - always_available = FALSE reqs = list( /obj/item/stack/sheet/bone = 10, /datum/reagent/fuel/oil = 5, ) result = /obj/structure/statue/bone/rib category = CAT_STRUCTURE + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED /datum/crafting_recipe/skull name = "Skull Carving" - always_available = FALSE reqs = list( /obj/item/stack/sheet/bone = 6, /datum/reagent/fuel/oil = 5, ) result = /obj/structure/statue/bone/skull category = CAT_STRUCTURE + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED /datum/crafting_recipe/halfskull name = "Cracked Skull Carving" - always_available = FALSE reqs = list( /obj/item/stack/sheet/bone = 3, /datum/reagent/fuel/oil = 5, ) result = /obj/structure/statue/bone/skull/half category = CAT_STRUCTURE + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED /datum/crafting_recipe/firecabinet name = "Fire Axe Cabinet" @@ -65,7 +65,6 @@ name = "Syndicate Uplink Beacon" result = /obj/structure/syndicate_uplink_beacon tool_behaviors = list(TOOL_SCREWDRIVER) - always_available = FALSE time = 6 SECONDS reqs = list( /obj/item/stack/sheet/iron = 5, @@ -74,3 +73,4 @@ /obj/item/stack/ore/bluespace_crystal = 1, ) category = CAT_STRUCTURE + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED diff --git a/code/datums/components/crafting/tools.dm b/code/datums/components/crafting/tools.dm index 65843e6baf4..e286e49616c 100644 --- a/code/datums/components/crafting/tools.dm +++ b/code/datums/components/crafting/tools.dm @@ -19,7 +19,6 @@ /datum/crafting_recipe/boneshovel name = "Serrated Bone Shovel" - always_available = FALSE reqs = list( /obj/item/stack/sheet/bone = 4, /datum/reagent/fuel/oil = 5, @@ -27,6 +26,7 @@ ) result = /obj/item/shovel/serrated category = CAT_TOOLS + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED /datum/crafting_recipe/lasso name = "Bone Lasso" diff --git a/code/datums/components/crafting/weapon_ammo.dm b/code/datums/components/crafting/weapon_ammo.dm index 44b8055b3ff..32f34f2ae75 100644 --- a/code/datums/components/crafting/weapon_ammo.dm +++ b/code/datums/components/crafting/weapon_ammo.dm @@ -20,8 +20,8 @@ ) tool_behaviors = list(TOOL_WIRECUTTER) time = 0.5 SECONDS - always_available = FALSE category = CAT_WEAPON_AMMO + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED /datum/crafting_recipe/pulseslug name = "Pulse Slug Shell" @@ -71,8 +71,8 @@ category = CAT_WEAPON_AMMO /datum/crafting_recipe/improvisedslug - name = "Improvised Shotgun Shell" - result = /obj/item/ammo_casing/shotgun/improvised + name = "Junk Shell" + result = /obj/effect/spawner/random/junk_shell reqs = list( /obj/item/stack/sheet/iron = 2, /obj/item/stack/cable_coil = 1, @@ -85,10 +85,10 @@ /datum/crafting_recipe/trashball name = "Trashball" - always_available = FALSE result = /obj/item/stack/cannonball/trashball reqs = list( /obj/item/stack/sheet = 5, /datum/reagent/consumable/space_cola = 10, ) category = CAT_WEAPON_AMMO + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED diff --git a/code/datums/components/shell.dm b/code/datums/components/shell.dm index 5b6361b9ee6..20fbeb73927 100644 --- a/code/datums/components/shell.dm +++ b/code/datums/components/shell.dm @@ -173,7 +173,7 @@ if(istype(item, /obj/item/inducer)) var/obj/item/inducer/inducer = item - INVOKE_ASYNC(inducer, TYPE_PROC_REF(/obj/item, attack_atom), attached_circuit, attacker, list()) + INVOKE_ASYNC(inducer, TYPE_PROC_REF(/obj/item, attack_atom), attached_circuit || parent, attacker, list()) return COMPONENT_NO_AFTERATTACK if(attached_circuit) diff --git a/code/datums/components/toggle_suit.dm b/code/datums/components/toggle_suit.dm index c4a378a16de..aee7522745e 100644 --- a/code/datums/components/toggle_suit.dm +++ b/code/datums/components/toggle_suit.dm @@ -15,6 +15,7 @@ return COMPONENT_INCOMPATIBLE var/atom/atom_parent = parent + atom_parent.flags_1 |= HAS_CONTEXTUAL_SCREENTIPS_1 src.toggle_noun = toggle_noun src.base_icon_state = atom_parent.base_icon_state || atom_parent.icon_state @@ -22,9 +23,10 @@ /datum/component/toggle_icon/RegisterWithParent() RegisterSignal(parent, COMSIG_CLICK_ALT, PROC_REF(on_click_alt)) RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) + RegisterSignal(parent, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, PROC_REF(on_adding_context)) /datum/component/toggle_icon/UnregisterFromParent() - UnregisterSignal(parent, list(COMSIG_CLICK_ALT, COMSIG_ATOM_EXAMINE)) + UnregisterSignal(parent, list(COMSIG_CLICK_ALT, COMSIG_ATOM_EXAMINE, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM)) /* * Signal proc for COMSIG_CLICK_ALT. @@ -69,6 +71,21 @@ examine_list += span_notice("Alt-click on [source] to toggle the [toggle_noun].") +/* + * Signal proc for COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM. + * Adds usage context for toggling the parent open or closed. + * + * source - the atom context is requested from (parent) + * context - the list of usage contexts set + * held_item - the item held by the requesting mob + * user - the mob requesting context + */ +/datum/component/toggle_icon/proc/on_adding_context(atom/source, list/context, obj/item/held_item, mob/user) + SIGNAL_HANDLER + + context[SCREENTIP_CONTEXT_ALT_LMB] = "Toggle [toggle_noun]" + return CONTEXTUAL_SCREENTIP_SET + /* * Actually do the toggle of the icon. * Swaps the icon from [base_icon_state] to [base_icon_state]_t. diff --git a/code/datums/datum.dm b/code/datums/datum.dm index e98f0941d64..83015d62f93 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -318,7 +318,7 @@ ASSERT(isatom(src) || istype(src, /image)) var/atom/atom_cast = src // filters only work with images or atoms. atom_cast.filters = null - filter_data = sortTim(filter_data, GLOBAL_PROC_REF(cmp_filter_data_priority), TRUE) + sortTim(filter_data, GLOBAL_PROC_REF(cmp_filter_data_priority), TRUE) for(var/filter_raw in filter_data) var/list/data = filter_data[filter_raw] var/list/arguments = data.Copy() diff --git a/code/datums/dna.dm b/code/datums/dna.dm index 2d663d914ae..88dcae3ba7e 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -939,7 +939,7 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) dna.remove_all_mutations() dna.stability = 100 if(prob(max(70-instability,0))) - switch(rand(0,10)) //not complete and utter death + switch(rand(0,11)) //not complete and utter death if(0) monkeyize() if(1) @@ -976,6 +976,9 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) if(9 to 10) ForceContractDisease(new/datum/disease/gastrolosis()) to_chat(src, span_notice("Oh, I actually feel quite alright!")) + if(11) + to_chat(src, span_notice("Your DNA mutates into the ultimate biological form!")) + crabize() else switch(rand(0,6)) if(0) diff --git a/code/datums/elements/corrupted_organ.dm b/code/datums/elements/corrupted_organ.dm new file mode 100644 index 00000000000..e7f8524b851 --- /dev/null +++ b/code/datums/elements/corrupted_organ.dm @@ -0,0 +1,66 @@ +/// Component applying shared behaviour by cursed organs granted when sacrificed by a heretic +/// Mostly just does something spooky when it is removed +/datum/element/corrupted_organ + +/datum/element/corrupted_organ/Attach(datum/target) + . = ..() + if (!isinternalorgan(target)) + return ELEMENT_INCOMPATIBLE + + RegisterSignal(target, COMSIG_ORGAN_SURGICALLY_REMOVED, PROC_REF(on_removed)) + + var/atom/atom_parent = target + atom_parent.color = COLOR_VOID_PURPLE + + atom_parent.add_filter(name = "ray", priority = 1, params = list( + type = "rays", + size = 12, + color = COLOR_VOID_PURPLE, + density = 12 + )) + var/ray_filter = atom_parent.get_filter("ray") + animate(ray_filter, offset = 100, time = 2 MINUTES, loop = -1, flags = ANIMATION_PARALLEL) // Absurdly long animate so nobody notices it hitching when it loops + animate(offset = 0, time = 2 MINUTES) // I sure hope duration of animate doesnt have any performance effect + +/datum/element/corrupted_organ/Detach(datum/source) + UnregisterSignal(source, list(COMSIG_ORGAN_SURGICALLY_REMOVED)) + return ..() + +/// When we're taken out of someone, do something spooky +/datum/element/corrupted_organ/proc/on_removed(atom/organ, mob/living/carbon/loser) + SIGNAL_HANDLER + if (loser.has_reagent(/datum/reagent/water/holywater) || loser.can_block_magic(MAGIC_RESISTANCE|MAGIC_RESISTANCE_HOLY) || prob(20)) + return + if (prob(75)) + organ.AddComponent(\ + /datum/component/haunted_item,\ + haunt_color = "#00000000", \ + aggro_radius = 4, \ + spawn_message = span_revenwarning("[organ] hovers ominously into the air, pulsating with unnatural vigour!"), \ + despawn_message = span_revenwarning("[organ] falls motionless to the ground."), \ + ) + return + var/turf/origin_turf = get_turf(organ) + playsound(organ, 'sound/magic/forcewall.ogg', vol = 100) + new /obj/effect/temp_visual/curse_blast(origin_turf) + organ.visible_message(span_revenwarning("[organ] explodes in a burst of dark energy!")) + for(var/mob/living/target in range(1, origin_turf)) + var/armor = target.run_armor_check(attack_flag = BOMB) + target.apply_damage(30, damagetype = BURN, blocked = armor, spread_damage = TRUE) + qdel(organ) + +/obj/effect/temp_visual/curse_blast + icon = 'icons/effects/64x64.dmi' + pixel_x = -16 + pixel_y = -16 + icon_state = "curse" + duration = 0.3 SECONDS + +/obj/effect/temp_visual/curse_blast/Initialize(mapload) + . = ..() + animate(src, transform = matrix() * 0.2, time = 0, flags = ANIMATION_PARALLEL) + animate(transform = matrix() * 2, time = duration, easing = EASE_IN) + + animate(src, alpha = 255, time = 0, flags = ANIMATION_PARALLEL) + animate(alpha = 255, time = 0.2 SECONDS) + animate(alpha = 0, time = 0.1 SECONDS) diff --git a/code/datums/elements/relay_attackers.dm b/code/datums/elements/relay_attackers.dm index a6c319d7bc9..5f5bf7ed589 100644 --- a/code/datums/elements/relay_attackers.dm +++ b/code/datums/elements/relay_attackers.dm @@ -7,14 +7,15 @@ /datum/element/relay_attackers/Attach(datum/target) . = ..() - // Boy this sure is a lot of ways to tell us that someone tried to attack us - RegisterSignal(target, COMSIG_ATOM_AFTER_ATTACKEDBY, PROC_REF(after_attackby)) - RegisterSignals(target, list(COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_ATTACK_PAW, COMSIG_MOB_ATTACK_ALIEN), PROC_REF(on_attack_generic)) - RegisterSignals(target, list(COMSIG_ATOM_ATTACK_BASIC_MOB, COMSIG_ATOM_ATTACK_ANIMAL), PROC_REF(on_attack_npc)) - RegisterSignal(target, COMSIG_PROJECTILE_PREHIT, PROC_REF(on_bullet_act)) - RegisterSignal(target, COMSIG_ATOM_PREHITBY, PROC_REF(on_hitby)) - RegisterSignal(target, COMSIG_ATOM_HULK_ATTACK, PROC_REF(on_attack_hulk)) - RegisterSignal(target, COMSIG_ATOM_ATTACK_MECH, PROC_REF(on_attack_mech)) + if (!HAS_TRAIT(target, TRAIT_RELAYING_ATTACKER)) // Little bit gross but we want to just apply this shit from a bunch of places + // Boy this sure is a lot of ways to tell us that someone tried to attack us + RegisterSignal(target, COMSIG_ATOM_AFTER_ATTACKEDBY, PROC_REF(after_attackby)) + RegisterSignals(target, list(COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_ATTACK_PAW, COMSIG_MOB_ATTACK_ALIEN), PROC_REF(on_attack_generic)) + RegisterSignals(target, list(COMSIG_ATOM_ATTACK_BASIC_MOB, COMSIG_ATOM_ATTACK_ANIMAL), PROC_REF(on_attack_npc)) + RegisterSignal(target, COMSIG_PROJECTILE_PREHIT, PROC_REF(on_bullet_act)) + RegisterSignal(target, COMSIG_ATOM_PREHITBY, PROC_REF(on_hitby)) + RegisterSignal(target, COMSIG_ATOM_HULK_ATTACK, PROC_REF(on_attack_hulk)) + RegisterSignal(target, COMSIG_ATOM_ATTACK_MECH, PROC_REF(on_attack_mech)) ADD_TRAIT(target, TRAIT_RELAYING_ATTACKER, REF(src)) /datum/element/relay_attackers/Detach(datum/source, ...) diff --git a/code/datums/storage/storage.dm b/code/datums/storage/storage.dm index 9b661688258..34c3038460e 100644 --- a/code/datums/storage/storage.dm +++ b/code/datums/storage/storage.dm @@ -443,11 +443,12 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) * * mob/user - (optional) the user who is inserting the item. * * override - see item_insertion_feedback() * * force - bypass locked storage up to a certain level. See [code/__DEFINES/storage.dm] + * * messages - if TRUE, we will create balloon alerts for the user. */ -/datum/storage/proc/attempt_insert(obj/item/to_insert, mob/user, override = FALSE, force = STORAGE_NOT_LOCKED) +/datum/storage/proc/attempt_insert(obj/item/to_insert, mob/user, override = FALSE, force = STORAGE_NOT_LOCKED, messages = TRUE) SHOULD_NOT_SLEEP(TRUE) - if(!can_insert(to_insert, user, force = force)) + if(!can_insert(to_insert, user, messages = messages, force = force)) return FALSE SEND_SIGNAL(parent, COMSIG_STORAGE_STORED_ITEM, to_insert, user, force) diff --git a/code/datums/storage/subtypes/bag_of_holding.dm b/code/datums/storage/subtypes/bag_of_holding.dm index 5abc171e2cb..8a812d7064d 100644 --- a/code/datums/storage/subtypes/bag_of_holding.dm +++ b/code/datums/storage/subtypes/bag_of_holding.dm @@ -4,7 +4,7 @@ max_slots = 30 allow_big_nesting = TRUE -/datum/storage/bag_of_holding/attempt_insert(obj/item/to_insert, mob/user, override, force) +/datum/storage/bag_of_holding/attempt_insert(obj/item/to_insert, mob/user, override, force, messages) var/list/obj/item/storage/backpack/holding/matching = typecache_filter_list(to_insert.get_all_contents(), typecacheof(/obj/item/storage/backpack/holding)) matching -= parent matching -= real_location diff --git a/code/datums/storage/subtypes/pockets.dm b/code/datums/storage/subtypes/pockets.dm index b07635a6773..2f703e34686 100644 --- a/code/datums/storage/subtypes/pockets.dm +++ b/code/datums/storage/subtypes/pockets.dm @@ -4,7 +4,7 @@ max_total_storage = 50 rustle_sound = FALSE -/datum/storage/pockets/attempt_insert(obj/item/to_insert, mob/user, override, force) +/datum/storage/pockets/attempt_insert(obj/item/to_insert, mob/user, override, force, messages) . = ..() if(!.) return diff --git a/code/datums/votes/map_vote.dm b/code/datums/votes/map_vote.dm index 7b1794da93e..2942a40b833 100644 --- a/code/datums/votes/map_vote.dm +++ b/code/datums/votes/map_vote.dm @@ -21,15 +21,23 @@ /datum/vote/map_vote/create_vote() . = ..() - check_population(should_key_choices = FALSE) - if(length(choices) == 1) // Only one choice, no need to vote. Let's just auto-rotate it to the only remaining map because it would just happen anyways. - var/de_facto_winner = choices[1] - var/datum/map_config/change_me_out = global.config.maplist[de_facto_winner] - SSmapping.changemap(change_me_out) - to_chat(world, span_boldannounce("The map vote has been skipped because there is only one map left to vote for. The map has been changed to [change_me_out.map_name].")) - SSmapping.map_voted = TRUE // voted by not voting, very sad. + if(!.) return FALSE + choices -= get_choices_invalid_for_population() + if(length(choices) == 1) // Only one choice, no need to vote. Let's just auto-rotate it to the only remaining map because it would just happen anyways. + var/datum/map_config/change_me_out = global.config.maplist[choices[1]] + finalize_vote(choices[1])// voted by not voting, very sad. + to_chat(world, span_boldannounce("The map vote has been skipped because there is only one map left to vote for. \ + The map has been changed to [change_me_out.map_name].")) + return FALSE + if(length(choices) == 0) + to_chat(world, span_boldannounce("A map vote was called, but there are no maps to vote for! \ + Players, complain to the admins. Admins, complain to the coders.")) + return FALSE + + return TRUE + /datum/vote/map_vote/toggle_votable() CONFIG_SET(flag/allow_vote_map, !CONFIG_GET(flag/allow_vote_map)) @@ -42,38 +50,33 @@ return . if(forced) return VOTE_AVAILABLE - var/number_of_choices = length(check_population()) - if(number_of_choices < 2) - return "There [number_of_choices == 1 ? "is only one map" : "are no maps"] to choose from." + var/num_choices = length(default_choices - get_choices_invalid_for_population()) + if(num_choices <= 1) + return "There [num_choices == 1 ? "is only one map" : "are no maps"] to choose from." if(SSmapping.map_vote_rocked) return VOTE_AVAILABLE if(SSmapping.map_voted) return "The next map has already been selected." return VOTE_AVAILABLE -/// Before we create a vote, remove all maps from our choices that are outside of our population range. -/// Note that this can result in zero remaining choices for our vote, which is not ideal (but ultimately okay). -/// Argument should_key_choices is TRUE, pass as FALSE in a context where choices are already keyed in a list. -/datum/vote/map_vote/proc/check_population(should_key_choices = TRUE) - if(should_key_choices) - for(var/key in default_choices) - choices[key] = 0 - +/// Returns a list of all map options that are invalid for the current population. +/datum/vote/map_vote/proc/get_choices_invalid_for_population() var/filter_threshold = 0 if(SSticker.HasRoundStarted()) filter_threshold = get_active_player_count(alive_check = FALSE, afk_check = TRUE, human_check = FALSE) else filter_threshold = GLOB.clients.len - for(var/map in choices) + var/list/invalid_choices = list() + for(var/map in default_choices) var/datum/map_config/possible_config = config.maplist[map] if(possible_config.config_min_users > 0 && filter_threshold < possible_config.config_min_users) - choices -= map + invalid_choices += map else if(possible_config.config_max_users > 0 && filter_threshold > possible_config.config_max_users) - choices -= map + invalid_choices += map - return choices + return invalid_choices /datum/vote/map_vote/get_vote_result(list/non_voters) // Even if we have default no vote off, diff --git a/code/datums/wires/_wires.dm b/code/datums/wires/_wires.dm index 4b7bfd2d08f..c3c8a1c0e93 100644 --- a/code/datums/wires/_wires.dm +++ b/code/datums/wires/_wires.dm @@ -41,6 +41,9 @@ /// If every instance of these wires should be random. Prevents wires from showing up in station blueprints. var/randomize = FALSE + /// Lazy assoc list of refs to mobs to refs to photos they have studied for wires + var/list/studied_photos + /datum/wires/New(atom/holder) ..() if(!istype(holder, holder_type)) @@ -261,10 +264,10 @@ if(!randomize) if(user.is_holding_item_of_type(/obj/item/blueprints)) return TRUE - for(var/obj/item/photo/photo in user.held_items) - if(!photo.picture || !photo.picture.has_blueprints) - continue - return TRUE + if(!isnull(user.mind)) + for(var/obj/item/photo/photo in user.held_items) + if(LAZYACCESS(studied_photos, REF(user.mind)) == REF(photo)) + return TRUE return FALSE @@ -279,6 +282,37 @@ /datum/wires/proc/always_reveal_wire(color) return FALSE +#define STUDY_INTERACTION_KEY "studying_photo" + +/** + * Attempts to study a photo for blueprints. + */ +/datum/wires/proc/try_study_photo(mob/user) + if(randomize) + return + if(isnull(user.mind)) + return + if(DOING_INTERACTION(user, STUDY_INTERACTION_KEY)) + return + if(LAZYACCESS(studied_photos, REF(user.mind))) + return + for(var/obj/item/photo/photo in user.held_items) + if(!photo.picture?.has_blueprints) + continue + + var/study_length = 1 SECONDS * floor(min(photo.picture.psize_x, photo.picture.psize_y) / 32) + if(study_length >= 4 SECONDS) + to_chat(user, span_notice("You squint [photo]... Hey, there's blueprints in the frame! Really wish the photo was zoomed in, though. \ + It's rather difficult to make out the wires.")) + else + to_chat(user, span_notice("You glance at [photo], looking for wires in the pictured blueprints.")) + + if(do_after(user, study_length, holder, interaction_key = STUDY_INTERACTION_KEY, hidden = TRUE)) + LAZYSET(studied_photos, REF(user.mind), REF(photo)) + return + +#undef STUDY_INTERACTION_KEY + /datum/wires/ui_host() return holder @@ -295,6 +329,7 @@ if (!ui) ui = new(user, src, "Wires", "[holder.name] Wires") ui.open() + try_study_photo(user) /datum/wires/ui_data(mob/user) var/list/data = list() diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index 0412aab33e9..c3c277e73c6 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -207,7 +207,7 @@ Medical HUD! Basic mode needs suit sensors on. if(HAS_TRAIT(src, TRAIT_XENO_HOST)) holder.icon_state = "hudxeno" else if(stat == DEAD || (HAS_TRAIT(src, TRAIT_FAKEDEATH))) - if(can_defib_client()) + if(HAS_TRAIT(src, TRAIT_MIND_TEMPORARILY_GONE) || can_defib_client()) holder.icon_state = "huddefib" else holder.icon_state = "huddead" diff --git a/code/game/machinery/computer/teleporter.dm b/code/game/machinery/computer/teleporter.dm index 5baf5497853..d00c5824d8b 100644 --- a/code/game/machinery/computer/teleporter.dm +++ b/code/game/machinery/computer/teleporter.dm @@ -1,3 +1,6 @@ +#define REGIME_TELEPORTER "Teleporter" +#define REGIME_GATE "Gate" + /obj/machinery/computer/teleporter name = "teleporter control console" desc = "Used to control a linked teleportation Hub and Station." @@ -5,10 +8,13 @@ icon_keyboard = "teleport_key" light_color = LIGHT_COLOR_BLUE circuit = /obj/item/circuitboard/computer/teleporter - - var/regime_set = "Teleporter" + /// Currently can be "Teleporter" or "Gate" + var/regime_set = REGIME_TELEPORTER + /// The ID of this teleporter, used for linking to power stations var/id + /// The power station this teleporter is linked to var/obj/machinery/teleport/station/power_station + /// Whether the teleporter is currently calibrating var/calibrating ///Weakref to the target atom we're pointed at currently var/datum/weakref/target_ref @@ -63,7 +69,7 @@ data["power_station"] = power_station ? TRUE : FALSE data["teleporter_hub"] = power_station?.teleporter_hub ? TRUE : FALSE data["regime_set"] = regime_set - data["target"] = !target ? "None" : "[get_area(target)] [(regime_set != "Gate") ? "" : "Teleporter"]" + data["target"] = !target ? "None" : "[get_area(target)] [(regime_set != REGIME_GATE) ? "" : REGIME_TELEPORTER]" data["calibrating"] = calibrating if(power_station?.teleporter_hub?.calibrated || power_station?.teleporter_hub?.accuracy >= 3) @@ -145,10 +151,10 @@ /obj/machinery/computer/teleporter/proc/reset_regime() set_teleport_target(null) - if(regime_set == "Teleporter") - regime_set = "Gate" + if(regime_set == REGIME_TELEPORTER) + regime_set = REGIME_GATE else - regime_set = "Teleporter" + regime_set = REGIME_TELEPORTER /// Gets a list of targets to teleport to. /// List is an assoc list of descriptors to locations. @@ -156,7 +162,7 @@ var/list/targets = list() var/list/area_index = list() - if (regime_set == "Teleporter") + if (regime_set == REGIME_TELEPORTER) for (var/obj/item/beacon/beacon as anything in GLOB.teleportbeacons) if (!is_eligible(beacon)) continue @@ -199,9 +205,9 @@ /obj/machinery/computer/teleporter/proc/set_target(mob/user) var/list/targets = get_targets() - if (regime_set == "Teleporter") + if (regime_set == REGIME_TELEPORTER) var/desc = tgui_input_list(usr, "Select a location to lock in", "Locking Computer", sort_list(targets)) - if(isnull(desc) || !user.can_perform_action(src)) + if(isnull(desc) || !user.can_perform_action(src, ALLOW_SILICON_REACH)) return set_teleport_target(targets[desc]) user.log_message("set the teleporter target to [targets[desc]].]", LOG_GAME) @@ -211,7 +217,7 @@ return var/desc = tgui_input_list(usr, "Select a station to lock in", "Locking Computer", sort_list(targets)) - if(isnull(desc)|| !user.can_perform_action(src)) + if(isnull(desc)|| !user.can_perform_action(src, ALLOW_SILICON_REACH)) return var/obj/machinery/teleport/station/target_station = targets[desc] if(!target_station || !target_station.teleporter_hub) @@ -232,6 +238,10 @@ return FALSE return TRUE + +#undef REGIME_TELEPORTER +#undef REGIME_GATE + /obj/item/circuit_component/teleporter_control_console display_name = "Teleporter Control Console" desc = "Used to control a linked teleportation Hub and Station." diff --git a/code/game/machinery/dna_infuser/dna_infuser.dm b/code/game/machinery/dna_infuser/dna_infuser.dm index 7b5fcb501a0..7e5c58ef94c 100644 --- a/code/game/machinery/dna_infuser/dna_infuser.dm +++ b/code/game/machinery/dna_infuser/dna_infuser.dm @@ -99,7 +99,7 @@ /obj/machinery/dna_infuser/proc/end_infuse(fail_explanation, fail_title) var/mob/living/carbon/human/human_occupant = occupant if(human_occupant.infuse_organ(infusing_into)) - check_tier_progression(src) + check_tier_progression(human_occupant) to_chat(occupant, span_danger("You feel yourself becoming more... [infusing_into.infusion_desc]?")) infusing = FALSE infusing_into = null @@ -123,7 +123,7 @@ && target.has_status_effect(infusing_into.status_effect_type) \ ) max_tier_allowed++ - playsound(src.loc, 'sound/machines/ding.ogg', 50, TRUE) + playsound(src, 'sound/machines/ding.ogg', 50, TRUE) visible_message(span_notice("[src] dings as it records the results of the full infusion.")) /obj/machinery/dna_infuser/update_icon_state() diff --git a/code/game/machinery/dna_infuser/organ_sets/carp_organs.dm b/code/game/machinery/dna_infuser/organ_sets/carp_organs.dm index f44de87e92e..725d1b9ce85 100644 --- a/code/game/machinery/dna_infuser/organ_sets/carp_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/carp_organs.dm @@ -113,7 +113,7 @@ /obj/item/organ/internal/brain/carp/Initialize(mapload) . = ..() AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/carp) - AddElement(/datum/element/noticable_organ, "%PRONOUN_They seem%PRONOUN_S unable to stay still.") + AddElement(/datum/element/noticable_organ, "%PRONOUN_They seem%PRONOUN_s unable to stay still.") /obj/item/organ/internal/brain/carp/on_mob_insert(mob/living/carbon/brain_owner) . = ..() 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 a36ebc1d3c3..3f1983f8836 100644 --- a/code/game/machinery/dna_infuser/organ_sets/gondola_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/gondola_organs.dm @@ -31,7 +31,7 @@ Fluoride Stare: After someone says 5 words, blah blah blah... /obj/item/organ/internal/heart/gondola/Initialize(mapload) . = ..() AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/gondola) - AddElement(/datum/element/noticable_organ, "%PRONOUN_They radiate%PRONOUN_S an aura of serenity.") + AddElement(/datum/element/noticable_organ, "%PRONOUN_They radiate%PRONOUN_s an aura of serenity.") /obj/item/organ/internal/heart/gondola/Insert(mob/living/carbon/receiver, special, movement_flags) . = ..() diff --git a/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm b/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm index 56b147ffbee..2da7a4fd982 100644 --- a/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/rat_organs.dm @@ -61,7 +61,7 @@ /obj/item/organ/internal/heart/rat/Initialize(mapload) . = ..() AddElement(/datum/element/organ_set_bonus, /datum/status_effect/organ_set_bonus/rat) - AddElement(/datum/element/noticable_organ, "%PRONOUN_They hunch%PRONOUN_ES over unnaturally!") + AddElement(/datum/element/noticable_organ, "%PRONOUN_They hunch%PRONOUN_es over unnaturally!") /obj/item/organ/internal/heart/rat/on_mob_insert(mob/living/carbon/receiver) . = ..() diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index 00e27ec23a4..81a720cc123 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -73,42 +73,45 @@ com.target_ref = null visible_message(span_alert("Cannot authenticate locked on coordinates. Please reinstate coordinate matrix.")) return - if (ismovable(M)) - if(do_teleport(M, target, channel = TELEPORT_CHANNEL_BLUESPACE)) - use_energy(active_power_usage) - if(!calibrated && prob(30 - ((accuracy) * 10))) //oh dear a problem - if(ishuman(M))//don't remove people from the round randomly you jerks - var/mob/living/carbon/human/human = M - /* - SKRYAT EDIT CHANGE ORIGINAL - if(!(human.mob_biotypes & (MOB_ROBOTIC|MOB_MINERAL|MOB_UNDEAD|MOB_SPIRIT))) - var/datum/species/species_to_transform = /datum/species/fly - if(check_holidays(MOTH_WEEK)) - species_to_transform = /datum/species/moth - if(human.dna && human.dna.species.id != initial(species_to_transform.id)) - to_chat(M, span_hear("You hear a buzzing in your ears.")) - human.set_species(species_to_transform) - log_game("[human] ([key_name(human)]) was turned into a [initial(species_to_transform.name)] through [src].") - - */ //SKYRAT EDIT REMOVAL END - //SKRYAT EDIT CHANGE BEGIN - to_chat(human, span_danger("Your limbs lose molecular cohesion as you teleport!")) - var/list/bodyparts_dismember = list() - var/rad_mod = 0 - for(var/obj/item/bodypart/BP in human.bodyparts) - if(BP.body_zone == BODY_ZONE_CHEST || BP.body_zone== BODY_ZONE_HEAD) - continue - bodyparts_dismember.Add(BP) - for(var/i in 1 to 2) //Removing two bodyparts. - var/obj/item/bodypart/BP = pick(bodyparts_dismember) - if(!istype(BP)) - rad_mod += 300 //Bad snowflake, take more rads! - break - bodyparts_dismember.Remove(BP) //GC optimisation - BP.dismember() - qdel(BP) - //SKYRAT EDIT CHANGE END - calibrated = FALSE - return + if(!ismovable(M)) + return + var/turf/start_turf = get_turf(M) + if(!do_teleport(M, target, channel = TELEPORT_CHANNEL_BLUESPACE)) + return + use_energy(active_power_usage) + new /obj/effect/temp_visual/portal_animation(start_turf, src, M) + if(!calibrated && ishuman(M) && prob(30 - ((accuracy) * 10))) //oh dear a problem + var/mob/living/carbon/human/human = M + /*SKYRAT EDIT REMOVAL START + if(!(human.mob_biotypes & (MOB_ROBOTIC|MOB_MINERAL|MOB_UNDEAD|MOB_SPIRIT))) + var/datum/species/species_to_transform = /datum/species/fly + if(check_holidays(MOTH_WEEK)) + species_to_transform = /datum/species/moth + if(human.dna && human.dna.species.id != initial(species_to_transform.id)) + to_chat(M, span_hear("You hear a buzzing in your ears.")) + human.set_species(species_to_transform) + human.log_message("was turned into a [initial(species_to_transform.name)] through [src].", LOG_GAME) + SKYRAT EDIT REMOVAL END*/ + // SKYRAT EDIT ADDITION START + if(!HAS_TRAIT(human, TRAIT_NODISMEMBER)) + to_chat(human, span_danger("Your limbs lose molecular cohesion as you teleport!")) + var/list/bodyparts_dismember = list() + var/rad_mod = 0 + for(var/obj/item/bodypart/BP in human.bodyparts) + if(BP.body_zone == BODY_ZONE_CHEST || BP.body_zone== BODY_ZONE_HEAD) + continue + bodyparts_dismember.Add(BP) + for(var/i in 1 to 2) //Removing two bodyparts. + var/obj/item/bodypart/BP = pick(bodyparts_dismember) + if(!istype(BP)) + rad_mod += 300 //Bad snowflake, take more rads! + break + bodyparts_dismember.Remove(BP) //GC optimisation + human.log_message("lost a [initial(BP.name)] to the [src].", LOG_GAME) + BP.dismember() + qdel(BP) + // SKYRAT ADDITION END + calibrated = FALSE /obj/machinery/teleport/hub/update_icon_state() icon_state = "[base_icon_state][panel_open ? "-o" : (is_ready() ? 1 : 0)]" diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm index 0af1e402ee1..d977605b243 100644 --- a/code/game/objects/effects/decals/cleanable/misc.dm +++ b/code/game/objects/effects/decals/cleanable/misc.dm @@ -219,6 +219,14 @@ . = ..() . += emissive_appearance(icon, icon_state, src, alpha = src.alpha) +/// Nebula vomit with extra guests +/obj/effect/decal/cleanable/vomit/nebula/worms + +/obj/effect/decal/cleanable/vomit/nebula/worms/Initialize(mapload, list/datum/disease/diseases) + . = ..() + for (var/i in 1 to rand(2, 3)) + new /mob/living/basic/hivelord_brood(loc) + /obj/effect/decal/cleanable/vomit/old name = "crusty dried vomit" desc = "You try not to look at the chunks, and fail." diff --git a/code/game/objects/effects/phased_mob.dm b/code/game/objects/effects/phased_mob.dm index 1456fa350bf..dcd4e39189c 100644 --- a/code/game/objects/effects/phased_mob.dm +++ b/code/game/objects/effects/phased_mob.dm @@ -2,7 +2,7 @@ name = "water" anchored = TRUE flags_1 = PREVENT_CONTENTS_EXPLOSION_1 - resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | SHUTTLE_CRUSH_PROOF invisibility = INVISIBILITY_OBSERVER movement_type = FLOATING /// The movable which's jaunting in this dummy diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm index 8c52a76dbc0..2b4c9a987b1 100644 --- a/code/game/objects/effects/portals.dm +++ b/code/game/objects/effects/portals.dm @@ -140,10 +140,12 @@ no_effect = TRUE else last_effect = world.time + var/turf/start_turf = get_turf(M) if(do_teleport(M, real_target, innate_accuracy_penalty, no_effects = no_effect, channel = teleport_channel, forced = force_teleport)) if(isprojectile(M)) var/obj/projectile/P = M P.ignore_source_check = TRUE + new /obj/effect/temp_visual/portal_animation(start_turf, src, M) return TRUE return FALSE @@ -206,3 +208,22 @@ . = ..() if (. && !isdead(M)) qdel(src) + +/** + * Animation used for transitioning atoms which are teleporting somewhere via a portal + * + * To use, pass it the atom doing the teleporting and the atom that is being teleported in init. + */ +/obj/effect/temp_visual/portal_animation + duration = 0.25 SECONDS + +/obj/effect/temp_visual/portal_animation/Initialize(mapload, atom/portal, atom/movable/teleporting) + . = ..() + if(isnull(portal) || isnull(teleporting)) + return + + appearance = teleporting.appearance + dir = teleporting.dir + layer = portal.layer + 0.01 + alpha = teleporting.alpha + animate(src, pixel_x = (portal.x * 32) - (x * 32), pixel_y = (portal.y * 32) - (y * 32), alpha = 0, time = duration) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 3d92ccd437e..a397dbb02f9 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -268,9 +268,7 @@ if(LAZYLEN(embedding)) updateEmbedding() - if(unique_reskin) - RegisterSignal(src, COMSIG_CLICK_ALT, PROC_REF(on_click_alt_reskin)) - register_context() + setup_reskinning() /obj/item/Destroy(force) diff --git a/code/game/objects/items/granters/crafting/pipegun.dm b/code/game/objects/items/granters/crafting/pipegun.dm index 8d331b2286d..e54439350da 100644 --- a/code/game/objects/items/granters/crafting/pipegun.dm +++ b/code/game/objects/items/granters/crafting/pipegun.dm @@ -11,6 +11,7 @@ "Did he drop this into a moisture trap? Yuck.", "Toolboxing techniques, huh? I kinda just want to know how to make the gun.", "What the hell does he mean by 'ancient warrior tradition'?", + "...the true masters of this place are not those who merely inhabit it...", ) /obj/item/book/granter/crafting_recipe/dusting/laser_musket_prime diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index 064f933573c..63625536b74 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -1,19 +1,20 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ - new/datum/stack_recipe("grille", /obj/structure/grille, 2, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = FALSE, check_density = FALSE, category = CAT_STRUCTURE), \ - new/datum/stack_recipe("table frame", /obj/structure/table_frame, 2, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ - new/datum/stack_recipe("scooter frame", /obj/item/scooter_frame, 10, time = 2.5 SECONDS, one_per_turf = FALSE, category = CAT_ENTERTAINMENT), \ - new/datum/stack_recipe("linen bin", /obj/structure/bedsheetbin/empty, 2, time = 0.5 SECONDS, one_per_turf = FALSE, category = CAT_CONTAINERS), \ - new/datum/stack_recipe("railing", /obj/structure/railing, 2, time = 1 SECONDS, check_direction = TRUE, category = CAT_STRUCTURE), \ - new/datum/stack_recipe("railing corner", /obj/structure/railing/corner, 1, time = 1 SECONDS, check_direction = TRUE, category = CAT_STRUCTURE), \ - new/datum/stack_recipe("railing end", /obj/structure/railing/corner/end, 1, time = 1 SECONDS, check_direction = TRUE, category = CAT_STRUCTURE), \ - new/datum/stack_recipe("railing end (flipped)", /obj/structure/railing/corner/end/flip, 1, time = 1 SECONDS, check_direction = TRUE, category = CAT_STRUCTURE), \ - new/datum/stack_recipe("tank holder", /obj/structure/tank_holder, 2, time = 0.5 SECONDS, one_per_turf = TRUE, on_solid_ground = FALSE, check_density = FALSE, category = CAT_FURNITURE), \ - new/datum/stack_recipe("ladder", /obj/structure/ladder/crafted, 15, time = 15 SECONDS, one_per_turf = TRUE, on_solid_ground = FALSE, check_density = FALSE, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("grille", /obj/structure/grille, 2, time = 1 SECONDS, crafting_flags = CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("table frame", /obj/structure/table_frame, 2, time = 1 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ + new/datum/stack_recipe("scooter frame", /obj/item/scooter_frame, 10, time = 2.5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY, category = CAT_ENTERTAINMENT), \ + new/datum/stack_recipe("linen bin", /obj/structure/bedsheetbin/empty, 2, time = 0.5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY, category = CAT_CONTAINERS), \ + new/datum/stack_recipe("railing", /obj/structure/railing, 2, time = 1 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_CHECK_DIRECTION, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("railing corner", /obj/structure/railing/corner, 1, time = 1 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_CHECK_DIRECTION, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("railing end", /obj/structure/railing/corner/end, 1, time = 1 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_CHECK_DIRECTION, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("railing end (flipped)", /obj/structure/railing/corner/end/flip, 1, time = 1 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_CHECK_DIRECTION, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("tank holder", /obj/structure/tank_holder, 2, time = 0.5 SECONDS, crafting_flags = CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ + new/datum/stack_recipe("ladder", /obj/structure/ladder/crafted, 15, time = 15 SECONDS, crafting_flags = CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_STRUCTURE), \ new/datum/stack_recipe("catwalk floor tile", /obj/item/stack/tile/catwalk_tile, 1, 4, 20, category = CAT_TILES), \ - new/datum/stack_recipe("stairs frame", /obj/structure/stairs_frame, 10, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_STRUCTURE), \ - new/datum/stack_recipe("white cane", /obj/item/cane/white, 3, time = 1 SECONDS, one_per_turf = FALSE, category = CAT_TOOLS), \ - new/datum/stack_recipe("sharpened iron rod", /obj/item/ammo_casing/rebar, 1, time = 0.2 SECONDS, one_per_turf = FALSE, category = CAT_WEAPON_AMMO), \ + new/datum/stack_recipe("stairs frame", /obj/structure/stairs_frame, 10, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("white cane", /obj/item/cane/white, 3, time = 1 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY, category = CAT_TOOLS), \ + new/datum/stack_recipe("sharpened iron rod", /obj/item/ammo_casing/rebar, 1, time = 0.2 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY, category = CAT_WEAPON_AMMO), \ )) + /obj/item/stack/rods name = "iron rod" desc = "Some rods. Can be used for building or something." diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 1f66b80cf55..e93b8c4cea5 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -9,9 +9,9 @@ * Glass sheets */ GLOBAL_LIST_INIT(glass_recipes, list ( \ - new/datum/stack_recipe("directional window", /obj/structure/window/unanchored, time = 0.5 SECONDS, on_solid_ground = TRUE, check_direction = TRUE, category = CAT_WINDOWS), \ - new/datum/stack_recipe("fulltile window", /obj/structure/window/fulltile/unanchored, 2, time = 1 SECONDS, on_solid_ground = TRUE, is_fulltile = TRUE, category = CAT_WINDOWS), \ - new/datum/stack_recipe("glass shard", /obj/item/shard, time = 0, on_solid_ground = TRUE, category = CAT_MISC), \ + new/datum/stack_recipe("directional window", /obj/structure/window/unanchored, time = 0.5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND | CRAFT_CHECK_DIRECTION, category = CAT_WINDOWS), \ + new/datum/stack_recipe("fulltile window", /obj/structure/window/fulltile/unanchored, 2, time = 1 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND | CRAFT_IS_FULLTILE, category = CAT_WINDOWS), \ + new/datum/stack_recipe("glass shard", /obj/item/shard, time = 0, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND, category = CAT_MISC), \ new/datum/stack_recipe("glass tile", /obj/item/stack/tile/glass, 1, 4, 20, category = CAT_TILES) \ )) @@ -82,9 +82,9 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \ return ..() GLOBAL_LIST_INIT(pglass_recipes, list ( \ - new/datum/stack_recipe("directional window", /obj/structure/window/plasma/unanchored, time = 0.5 SECONDS, on_solid_ground = TRUE, check_direction = TRUE, category = CAT_WINDOWS), \ - new/datum/stack_recipe("fulltile window", /obj/structure/window/plasma/fulltile/unanchored, 2, time = 2 SECONDS, on_solid_ground = TRUE, is_fulltile = TRUE, category = CAT_WINDOWS), \ - new/datum/stack_recipe("plasma glass shard", /obj/item/shard/plasma, time = 20, on_solid_ground = TRUE, category = CAT_MISC), \ + new/datum/stack_recipe("directional window", /obj/structure/window/plasma/unanchored, time = 0.5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND | CRAFT_CHECK_DIRECTION, category = CAT_WINDOWS), \ + new/datum/stack_recipe("fulltile window", /obj/structure/window/plasma/fulltile/unanchored, 2, time = 2 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND | CRAFT_IS_FULLTILE, category = CAT_WINDOWS), \ + new/datum/stack_recipe("plasma glass shard", /obj/item/shard/plasma, time = 20, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND, category = CAT_MISC), \ new/datum/stack_recipe("plasma glass tile", /obj/item/stack/tile/glass/plasma, 1, 4, 20, category = CAT_TILES) \ )) @@ -138,11 +138,11 @@ GLOBAL_LIST_INIT(pglass_recipes, list ( \ * Reinforced glass sheets */ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \ - new/datum/stack_recipe("windoor frame", /obj/structure/windoor_assembly, 5, time = 0, on_solid_ground = TRUE, check_direction = TRUE, category = CAT_WINDOWS), \ + new/datum/stack_recipe("windoor frame", /obj/structure/windoor_assembly, 5, time = 0, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND | CRAFT_CHECK_DIRECTION, category = CAT_WINDOWS), \ null, \ - new/datum/stack_recipe("directional reinforced window", /obj/structure/window/reinforced/unanchored, time = 0.5 SECONDS, on_solid_ground = TRUE, check_direction = TRUE, category = CAT_WINDOWS), \ - new/datum/stack_recipe("fulltile reinforced window", /obj/structure/window/reinforced/fulltile/unanchored, 2, time = 2 SECONDS, on_solid_ground = TRUE, is_fulltile = TRUE, category = CAT_WINDOWS), \ - new/datum/stack_recipe("glass shard", /obj/item/shard, time = 10, on_solid_ground = TRUE, category = CAT_MISC), \ + new/datum/stack_recipe("directional reinforced window", /obj/structure/window/reinforced/unanchored, time = 0.5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND | CRAFT_CHECK_DIRECTION, category = CAT_WINDOWS), \ + new/datum/stack_recipe("fulltile reinforced window", /obj/structure/window/reinforced/fulltile/unanchored, 2, time = 2 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND | CRAFT_IS_FULLTILE, category = CAT_WINDOWS), \ + new/datum/stack_recipe("glass shard", /obj/item/shard, time = 10, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND, category = CAT_MISC), \ new/datum/stack_recipe("reinforced glass tile", /obj/item/stack/tile/rglass, 1, 4, 20, category = CAT_TILES) \ )) @@ -177,9 +177,9 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \ . += GLOB.reinforced_glass_recipes GLOBAL_LIST_INIT(prglass_recipes, list ( \ - new/datum/stack_recipe("directional reinforced window", /obj/structure/window/reinforced/plasma/unanchored, time = 0.5 SECONDS, on_solid_ground = TRUE, check_direction = TRUE, category = CAT_WINDOWS), \ - new/datum/stack_recipe("fulltile reinforced window", /obj/structure/window/reinforced/plasma/fulltile/unanchored, 2, time = 2 SECONDS, on_solid_ground = TRUE, is_fulltile = TRUE, category = CAT_WINDOWS), \ - new/datum/stack_recipe("plasma glass shard", /obj/item/shard/plasma, time = 40, on_solid_ground = TRUE, category = CAT_MISC), \ + new/datum/stack_recipe("directional reinforced window", /obj/structure/window/reinforced/plasma/unanchored, time = 0.5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND | CRAFT_CHECK_DIRECTION, category = CAT_WINDOWS), \ + new/datum/stack_recipe("fulltile reinforced window", /obj/structure/window/reinforced/plasma/fulltile/unanchored, 2, time = 2 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND | CRAFT_IS_FULLTILE, category = CAT_WINDOWS), \ + new/datum/stack_recipe("plasma glass shard", /obj/item/shard/plasma, time = 40, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND, category = CAT_MISC), \ new/datum/stack_recipe("reinforced plasma glass tile", /obj/item/stack/tile/rglass/plasma, 1, 4, 20, category = CAT_TILES) \ )) @@ -212,8 +212,8 @@ GLOBAL_LIST_INIT(prglass_recipes, list ( \ . += GLOB.prglass_recipes GLOBAL_LIST_INIT(titaniumglass_recipes, list( - new/datum/stack_recipe("shuttle window", /obj/structure/window/reinforced/shuttle/unanchored, 2, time = 0.5 SECONDS, on_solid_ground = TRUE, check_direction = TRUE, is_fulltile = TRUE, category = CAT_WINDOWS), \ - new/datum/stack_recipe("titanium glass shard", /obj/item/shard/titanium, time = 40, on_solid_ground = TRUE, category = CAT_MISC) \ + new/datum/stack_recipe("shuttle window", /obj/structure/window/reinforced/shuttle/unanchored, 2, time = 0.5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND | CRAFT_CHECK_DIRECTION | CRAFT_IS_FULLTILE, category = CAT_WINDOWS), \ + new/datum/stack_recipe("titanium glass shard", /obj/item/shard/titanium, time = 40, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND, category = CAT_MISC) \ )) /obj/item/stack/sheet/titaniumglass @@ -241,8 +241,8 @@ GLOBAL_LIST_INIT(titaniumglass_recipes, list( . += GLOB.titaniumglass_recipes GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( - new/datum/stack_recipe("plastitanium window", /obj/structure/window/reinforced/plasma/plastitanium/unanchored, 2, time = 2 SECONDS, on_solid_ground = TRUE, is_fulltile = TRUE, category = CAT_WINDOWS), \ - new/datum/stack_recipe("plastitanium glass shard", /obj/item/shard/plastitanium, time = 60, on_solid_ground = TRUE, category = CAT_MISC) \ + new/datum/stack_recipe("plastitanium window", /obj/structure/window/reinforced/plasma/plastitanium/unanchored, 2, time = 2 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND | CRAFT_IS_FULLTILE, category = CAT_WINDOWS), \ + new/datum/stack_recipe("plastitanium glass shard", /obj/item/shard/plastitanium, time = 60, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND, category = CAT_MISC) \ )) /obj/item/stack/sheet/plastitaniumglass diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index 851e544ff8a..2d1636e9e16 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -14,8 +14,8 @@ merge_type = /obj/item/stack/sheet/animalhide/human GLOBAL_LIST_INIT(human_recipes, list( \ - new/datum/stack_recipe("bloated human costume", /obj/item/clothing/suit/hooded/bloated_human, 5, check_density = FALSE, category = CAT_CLOTHING), \ - new/datum/stack_recipe("human skin hat", /obj/item/clothing/head/fedora/human_leather, 1, check_density = FALSE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("bloated human costume", /obj/item/clothing/suit/hooded/bloated_human, 5, crafting_flags = NONE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("human skin hat", /obj/item/clothing/head/fedora/human_leather, 1, crafting_flags = NONE, category = CAT_CLOTHING), \ )) /obj/item/stack/sheet/animalhide/human/get_main_recipes() @@ -55,9 +55,9 @@ GLOBAL_LIST_INIT(human_recipes, list( \ amount = 5 GLOBAL_LIST_INIT(gondola_recipes, list ( \ - new/datum/stack_recipe("gondola mask", /obj/item/clothing/mask/gondola, 1, check_density = FALSE, category = CAT_CLOTHING), \ - new/datum/stack_recipe("gondola suit", /obj/item/clothing/under/costume/gondola, 2, check_density = FALSE, category = CAT_CLOTHING), \ - new/datum/stack_recipe("gondola bedsheet", /obj/item/bedsheet/gondola, 1, check_density = FALSE, category = CAT_FURNITURE), \ + new/datum/stack_recipe("gondola mask", /obj/item/clothing/mask/gondola, 1, crafting_flags = NONE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("gondola suit", /obj/item/clothing/under/costume/gondola, 2, crafting_flags = NONE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("gondola bedsheet", /obj/item/bedsheet/gondola, 1, crafting_flags = NONE, category = CAT_FURNITURE), \ )) /obj/item/stack/sheet/animalhide/gondola @@ -73,7 +73,7 @@ GLOBAL_LIST_INIT(gondola_recipes, list ( \ . += GLOB.gondola_recipes GLOBAL_LIST_INIT(corgi_recipes, list ( \ - new/datum/stack_recipe("corgi costume", /obj/item/clothing/suit/hooded/ian_costume, 3, check_density = FALSE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("corgi costume", /obj/item/clothing/suit/hooded/ian_costume, 3, crafting_flags = NONE, category = CAT_CLOTHING), \ )) /obj/item/stack/sheet/animalhide/corgi/get_main_recipes() @@ -100,8 +100,8 @@ GLOBAL_LIST_INIT(corgi_recipes, list ( \ merge_type = /obj/item/stack/sheet/animalhide/monkey GLOBAL_LIST_INIT(monkey_recipes, list ( \ - new/datum/stack_recipe("monkey mask", /obj/item/clothing/mask/gas/monkeymask, 1, check_density = FALSE, category = CAT_CLOTHING), \ - new/datum/stack_recipe("monkey suit", /obj/item/clothing/suit/costume/monkeysuit, 2, check_density = FALSE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("monkey mask", /obj/item/clothing/mask/gas/monkeymask, 1, crafting_flags = NONE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("monkey suit", /obj/item/clothing/suit/costume/monkeysuit, 2, crafting_flags = NONE, category = CAT_CLOTHING), \ )) /obj/item/stack/sheet/animalhide/monkey/get_main_recipes() @@ -131,8 +131,8 @@ GLOBAL_LIST_INIT(monkey_recipes, list ( \ merge_type = /obj/item/stack/sheet/animalhide/xeno GLOBAL_LIST_INIT(xeno_recipes, list ( \ - new/datum/stack_recipe("alien helmet", /obj/item/clothing/head/costume/xenos, 1, check_density = FALSE, category = CAT_CLOTHING), \ - new/datum/stack_recipe("alien suit", /obj/item/clothing/suit/costume/xenos, 2, check_density = FALSE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("alien helmet", /obj/item/clothing/head/costume/xenos, 1, crafting_flags = NONE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("alien suit", /obj/item/clothing/suit/costume/xenos, 2, crafting_flags = NONE, category = CAT_CLOTHING), \ )) /obj/item/stack/sheet/animalhide/xeno/get_main_recipes() @@ -151,11 +151,11 @@ GLOBAL_LIST_INIT(xeno_recipes, list ( \ merge_type = /obj/item/stack/sheet/animalhide/carp GLOBAL_LIST_INIT(carp_recipes, list ( \ - new/datum/stack_recipe("carp costume", /obj/item/clothing/suit/hooded/carp_costume, 4, check_density = FALSE, category = CAT_CLOTHING), \ - new/datum/stack_recipe("carp mask", /obj/item/clothing/mask/gas/carp, 1, check_density = FALSE, category = CAT_CLOTHING), \ - new/datum/stack_recipe("carpskin chair", /obj/structure/chair/comfy/carp, 2, check_density = FALSE, category = CAT_FURNITURE), \ - new/datum/stack_recipe("carpskin suit", /obj/item/clothing/under/suit/carpskin, 3, check_density = FALSE, category = CAT_CLOTHING), \ - new/datum/stack_recipe("carpskin fedora", /obj/item/clothing/head/fedora/carpskin, 2, check_density = FALSE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("carp costume", /obj/item/clothing/suit/hooded/carp_costume, 4, crafting_flags = NONE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("carp mask", /obj/item/clothing/mask/gas/carp, 1, crafting_flags = NONE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("carpskin chair", /obj/structure/chair/comfy/carp, 2, crafting_flags = NONE, category = CAT_FURNITURE), \ + new/datum/stack_recipe("carpskin suit", /obj/item/clothing/under/suit/carpskin, 3, crafting_flags = NONE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("carpskin fedora", /obj/item/clothing/head/fedora/carpskin, 2, crafting_flags = NONE, category = CAT_CLOTHING), \ )) /obj/item/stack/sheet/animalhide/carp/get_main_recipes() @@ -193,33 +193,33 @@ GLOBAL_LIST_INIT(carp_recipes, list ( \ merge_type = /obj/item/stack/sheet/leather GLOBAL_LIST_INIT(leather_recipes, list ( \ - new/datum/stack_recipe("wallet", /obj/item/storage/wallet, 1, check_density = FALSE, category = CAT_CONTAINERS), \ - new/datum/stack_recipe("muzzle", /obj/item/clothing/mask/muzzle, 2, check_density = FALSE, category = CAT_ENTERTAINMENT), \ - new/datum/stack_recipe("basketball", /obj/item/toy/basketball, 20, check_density = FALSE, category = CAT_ENTERTAINMENT), \ - new/datum/stack_recipe("baseball", /obj/item/toy/beach_ball/baseball, 3, check_density = FALSE, category = CAT_ENTERTAINMENT), \ - new/datum/stack_recipe("saddle", /obj/item/goliath_saddle, 5, check_density = FALSE, category = CAT_EQUIPMENT), \ - new/datum/stack_recipe("leather shoes", /obj/item/clothing/shoes/laceup, 2, check_density = FALSE, category = CAT_CLOTHING), \ - new/datum/stack_recipe("cowboy boots", /obj/item/clothing/shoes/cowboy, 2, check_density = FALSE, category = CAT_CLOTHING), \ - new/datum/stack_recipe("botany gloves", /obj/item/clothing/gloves/botanic_leather, 3, check_density = FALSE, category = CAT_CLOTHING), \ - new/datum/stack_recipe("leather satchel", /obj/item/storage/backpack/satchel/leather, 5, check_density = FALSE, category = CAT_CLOTHING), \ - new/datum/stack_recipe("sheriff vest", /obj/item/clothing/accessory/vest_sheriff, 4, check_density = FALSE, category = CAT_CLOTHING), \ - new/datum/stack_recipe("leather jacket", /obj/item/clothing/suit/jacket/leather, 7, check_density = FALSE, category = CAT_CLOTHING), \ - new/datum/stack_recipe("biker jacket", /obj/item/clothing/suit/jacket/leather/biker, 7, check_density = FALSE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("wallet", /obj/item/storage/wallet, 1, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new/datum/stack_recipe("muzzle", /obj/item/clothing/mask/muzzle, 2, crafting_flags = NONE, category = CAT_ENTERTAINMENT), \ + new/datum/stack_recipe("basketball", /obj/item/toy/basketball, 20, crafting_flags = NONE, category = CAT_ENTERTAINMENT), \ + new/datum/stack_recipe("baseball", /obj/item/toy/beach_ball/baseball, 3, crafting_flags = NONE, category = CAT_ENTERTAINMENT), \ + new/datum/stack_recipe("saddle", /obj/item/goliath_saddle, 5, crafting_flags = NONE, category = CAT_EQUIPMENT), \ + new/datum/stack_recipe("leather shoes", /obj/item/clothing/shoes/laceup, 2, crafting_flags = NONE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("cowboy boots", /obj/item/clothing/shoes/cowboy, 2, crafting_flags = NONE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("botany gloves", /obj/item/clothing/gloves/botanic_leather, 3, crafting_flags = NONE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("leather satchel", /obj/item/storage/backpack/satchel/leather, 5, crafting_flags = NONE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("sheriff vest", /obj/item/clothing/accessory/vest_sheriff, 4, crafting_flags = NONE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("leather jacket", /obj/item/clothing/suit/jacket/leather, 7, crafting_flags = NONE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("biker jacket", /obj/item/clothing/suit/jacket/leather/biker, 7, crafting_flags = NONE, category = CAT_CLOTHING), \ new/datum/stack_recipe_list("belts", list( \ - new/datum/stack_recipe("tool belt", /obj/item/storage/belt/utility, 4, check_density = FALSE, category = CAT_CONTAINERS), \ - new/datum/stack_recipe("botanical belt", /obj/item/storage/belt/plant, 2, check_density = FALSE, category = CAT_CONTAINERS), \ - new/datum/stack_recipe("janitorial belt", /obj/item/storage/belt/janitor, 2, check_density = FALSE, category = CAT_CONTAINERS), \ - new/datum/stack_recipe("medical belt", /obj/item/storage/belt/medical, 2, check_density = FALSE, category = CAT_CONTAINERS), \ - new/datum/stack_recipe("security belt", /obj/item/storage/belt/security, 2, check_density = FALSE, category = CAT_CONTAINERS), \ - new/datum/stack_recipe("shoulder holster", /obj/item/storage/belt/holster, 3, check_density = FALSE, category = CAT_CONTAINERS), \ - new/datum/stack_recipe("bandolier", /obj/item/storage/belt/bandolier, 5, check_density = FALSE, category = CAT_CONTAINERS), \ + new/datum/stack_recipe("tool belt", /obj/item/storage/belt/utility, 4, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new/datum/stack_recipe("botanical belt", /obj/item/storage/belt/plant, 2, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new/datum/stack_recipe("janitorial belt", /obj/item/storage/belt/janitor, 2, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new/datum/stack_recipe("medical belt", /obj/item/storage/belt/medical, 2, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new/datum/stack_recipe("security belt", /obj/item/storage/belt/security, 2, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new/datum/stack_recipe("shoulder holster", /obj/item/storage/belt/holster, 3, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new/datum/stack_recipe("bandolier", /obj/item/storage/belt/bandolier, 5, crafting_flags = NONE, category = CAT_CONTAINERS), \ )), new/datum/stack_recipe_list("cowboy hats", list( \ - new/datum/stack_recipe("sheriff hat", /obj/item/clothing/head/cowboy/brown, 2, check_density = FALSE, category = CAT_CLOTHING), \ - new/datum/stack_recipe("desperado hat", /obj/item/clothing/head/cowboy/black, 2, check_density = FALSE, category = CAT_CLOTHING), \ - new/datum/stack_recipe("ten-gallon hat", /obj/item/clothing/head/cowboy/white, 2, check_density = FALSE, category = CAT_CLOTHING), \ - new/datum/stack_recipe("deputy hat", /obj/item/clothing/head/cowboy/red, 2, check_density = FALSE, category = CAT_CLOTHING), \ - new/datum/stack_recipe("drifter hat", /obj/item/clothing/head/cowboy/grey, 2, check_density = FALSE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("sheriff hat", /obj/item/clothing/head/cowboy/brown, 2, crafting_flags = NONE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("desperado hat", /obj/item/clothing/head/cowboy/black, 2, crafting_flags = NONE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("ten-gallon hat", /obj/item/clothing/head/cowboy/white, 2, crafting_flags = NONE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("deputy hat", /obj/item/clothing/head/cowboy/red, 2, crafting_flags = NONE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("drifter hat", /obj/item/clothing/head/cowboy/grey, 2, crafting_flags = NONE, category = CAT_CLOTHING), \ )), )) @@ -263,7 +263,7 @@ GLOBAL_LIST_INIT(leather_recipes, list ( \ merge_type = /obj/item/stack/sheet/sinew/wolf GLOBAL_LIST_INIT(sinew_recipes, list ( \ - new/datum/stack_recipe("sinew restraints", /obj/item/restraints/handcuffs/cable/sinew, 1, check_density = FALSE, category = CAT_EQUIPMENT), \ + new/datum/stack_recipe("sinew restraints", /obj/item/restraints/handcuffs/cable/sinew, 1, crafting_flags = NONE, category = CAT_EQUIPMENT), \ )) /obj/item/stack/sheet/sinew/get_main_recipes() diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 1b3d66a7dae..f6e7d797fd9 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -24,8 +24,8 @@ Mineral Sheets */ GLOBAL_LIST_INIT(sandstone_recipes, list ( \ - new/datum/stack_recipe("sandstone door", /obj/structure/mineral_door/sandstone, 10, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, applies_mats = TRUE, category = CAT_DOORS), \ - new/datum/stack_recipe("Breakdown into sand", /obj/item/stack/ore/glass, 1, one_per_turf = FALSE, on_solid_ground = TRUE, category = CAT_MISC) \ + new/datum/stack_recipe("sandstone door", /obj/structure/mineral_door/sandstone, 10, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND | CRAFT_APPLIES_MATS, category = CAT_DOORS), \ + new/datum/stack_recipe("Breakdown into sand", /obj/item/stack/ore/glass, 1, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND, category = CAT_MISC) \ )) /obj/item/stack/sheet/mineral/sandstone @@ -62,7 +62,7 @@ GLOBAL_LIST_INIT(sandstone_recipes, list ( \ merge_type = /obj/item/stack/sheet/mineral/sandbags GLOBAL_LIST_INIT(sandbag_recipes, list ( \ - new/datum/stack_recipe("sandbags", /obj/structure/barricade/sandbags, 1, time = 3 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("sandbags", /obj/structure/barricade/sandbags, 1, time = 3 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_STRUCTURE), \ )) /obj/item/stack/sheet/mineral/sandbags/get_main_recipes() @@ -105,8 +105,8 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( \ walltype = /turf/closed/wall/mineral/diamond GLOBAL_LIST_INIT(diamond_recipes, list ( \ - new/datum/stack_recipe("diamond door", /obj/structure/mineral_door/transparent/diamond, 10, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, applies_mats = TRUE, category = CAT_DOORS), \ - new/datum/stack_recipe("diamond tile", /obj/item/stack/tile/mineral/diamond, 1, 4, 20, check_density = FALSE, category = CAT_TILES), \ + new/datum/stack_recipe("diamond door", /obj/structure/mineral_door/transparent/diamond, 10, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND | CRAFT_APPLIES_MATS, category = CAT_DOORS), \ + new/datum/stack_recipe("diamond tile", /obj/item/stack/tile/mineral/diamond, 1, 4, 20, crafting_flags = NONE, category = CAT_TILES), \ )) /obj/item/stack/sheet/mineral/diamond/get_main_recipes() @@ -130,8 +130,8 @@ GLOBAL_LIST_INIT(diamond_recipes, list ( \ walltype = /turf/closed/wall/mineral/uranium GLOBAL_LIST_INIT(uranium_recipes, list ( \ - new/datum/stack_recipe("uranium door", /obj/structure/mineral_door/uranium, 10, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, applies_mats = TRUE, category = CAT_DOORS), \ - new/datum/stack_recipe("uranium tile", /obj/item/stack/tile/mineral/uranium, 1, 4, 20, check_density = FALSE, category = CAT_TILES), \ + new/datum/stack_recipe("uranium door", /obj/structure/mineral_door/uranium, 10, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND | CRAFT_APPLIES_MATS, category = CAT_DOORS), \ + new/datum/stack_recipe("uranium tile", /obj/item/stack/tile/mineral/uranium, 1, 4, 20, crafting_flags = NONE, category = CAT_TILES), \ )) /obj/item/stack/sheet/mineral/uranium/get_main_recipes() @@ -167,8 +167,8 @@ GLOBAL_LIST_INIT(uranium_recipes, list ( \ return TOXLOSS//dont you kids know that stuff is toxic? GLOBAL_LIST_INIT(plasma_recipes, list ( \ - new/datum/stack_recipe("plasma door", /obj/structure/mineral_door/transparent/plasma, 10, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, applies_mats = TRUE, category = CAT_DOORS), \ - new/datum/stack_recipe("plasma tile", /obj/item/stack/tile/mineral/plasma, 1, 4, 20, check_density = FALSE, category = CAT_TILES), \ + new/datum/stack_recipe("plasma door", /obj/structure/mineral_door/transparent/plasma, 10, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND | CRAFT_APPLIES_MATS, category = CAT_DOORS), \ + new/datum/stack_recipe("plasma tile", /obj/item/stack/tile/mineral/plasma, 1, 4, 20, crafting_flags = NONE, category = CAT_TILES), \ )) /obj/item/stack/sheet/mineral/plasma/get_main_recipes() @@ -198,10 +198,10 @@ GLOBAL_LIST_INIT(plasma_recipes, list ( \ walltype = /turf/closed/wall/mineral/gold GLOBAL_LIST_INIT(gold_recipes, list ( \ - new/datum/stack_recipe("golden door", /obj/structure/mineral_door/gold, 10, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, applies_mats = TRUE, category = CAT_DOORS), \ - new/datum/stack_recipe("gold tile", /obj/item/stack/tile/mineral/gold, 1, 4, 20, check_density = FALSE, category = CAT_TILES), \ - new/datum/stack_recipe("blank plaque", /obj/item/plaque, 1, check_density = FALSE, category = CAT_FURNITURE), \ - new/datum/stack_recipe("Simple Crown", /obj/item/clothing/head/costume/crown, 5, check_density = FALSE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("golden door", /obj/structure/mineral_door/gold, 10, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND | CRAFT_APPLIES_MATS, category = CAT_DOORS), \ + new/datum/stack_recipe("gold tile", /obj/item/stack/tile/mineral/gold, 1, 4, 20, crafting_flags = NONE, category = CAT_TILES), \ + new/datum/stack_recipe("blank plaque", /obj/item/plaque, 1, crafting_flags = NONE, category = CAT_FURNITURE), \ + new/datum/stack_recipe("Simple Crown", /obj/item/clothing/head/costume/crown, 5, crafting_flags = NONE, category = CAT_CLOTHING), \ )) /obj/item/stack/sheet/mineral/gold/get_main_recipes() @@ -226,8 +226,8 @@ GLOBAL_LIST_INIT(gold_recipes, list ( \ walltype = /turf/closed/wall/mineral/silver GLOBAL_LIST_INIT(silver_recipes, list ( \ - new/datum/stack_recipe("silver door", /obj/structure/mineral_door/silver, 10, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, applies_mats = TRUE, category = CAT_DOORS), \ - new/datum/stack_recipe("silver tile", /obj/item/stack/tile/mineral/silver, 1, 4, 20, check_density = FALSE, category = CAT_TILES), \ + new/datum/stack_recipe("silver door", /obj/structure/mineral_door/silver, 10, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND | CRAFT_APPLIES_MATS, category = CAT_DOORS), \ + new/datum/stack_recipe("silver tile", /obj/item/stack/tile/mineral/silver, 1, 4, 20, crafting_flags = NONE, category = CAT_TILES), \ )) /obj/item/stack/sheet/mineral/silver/get_main_recipes() @@ -251,7 +251,7 @@ GLOBAL_LIST_INIT(silver_recipes, list ( \ walltype = /turf/closed/wall/mineral/bananium GLOBAL_LIST_INIT(bananium_recipes, list ( \ - new/datum/stack_recipe("bananium tile", /obj/item/stack/tile/mineral/bananium, 1, 4, 20, check_density = FALSE, category = CAT_TILES), \ + new/datum/stack_recipe("bananium tile", /obj/item/stack/tile/mineral/bananium, 1, 4, 20, crafting_flags = NONE, category = CAT_TILES), \ )) /obj/item/stack/sheet/mineral/bananium/get_main_recipes() @@ -282,8 +282,8 @@ GLOBAL_LIST_INIT(bananium_recipes, list ( \ walltype = /turf/closed/wall/mineral/titanium GLOBAL_LIST_INIT(titanium_recipes, list ( \ - new/datum/stack_recipe("Titanium tile", /obj/item/stack/tile/mineral/titanium, 1, 4, 20, check_density = FALSE, category = CAT_TILES), \ - new/datum/stack_recipe("Shuttle seat", /obj/structure/chair/comfy/shuttle, 2, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ + new/datum/stack_recipe("Titanium tile", /obj/item/stack/tile/mineral/titanium, 1, 4, 20, crafting_flags = NONE, category = CAT_TILES), \ + new/datum/stack_recipe("Shuttle seat", /obj/structure/chair/comfy/shuttle, 2, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ )) /obj/item/stack/sheet/mineral/titanium/get_main_recipes() @@ -315,7 +315,7 @@ GLOBAL_LIST_INIT(titanium_recipes, list ( \ walltype = /turf/closed/wall/mineral/plastitanium GLOBAL_LIST_INIT(plastitanium_recipes, list ( \ - new/datum/stack_recipe("plastitanium tile", /obj/item/stack/tile/mineral/plastitanium, 1, 4, 20, check_density = FALSE, category = CAT_TILES), \ + new/datum/stack_recipe("plastitanium tile", /obj/item/stack/tile/mineral/plastitanium, 1, 4, 20, crafting_flags = NONE, category = CAT_TILES), \ )) /obj/item/stack/sheet/mineral/plastitanium/get_main_recipes() @@ -341,10 +341,10 @@ GLOBAL_LIST_INIT(plastitanium_recipes, list ( \ material_type = /datum/material/snow GLOBAL_LIST_INIT(snow_recipes, list ( \ - new/datum/stack_recipe("snow wall", /turf/closed/wall/mineral/snow, 5, time = 4 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_STRUCTURE), \ - new/datum/stack_recipe("snowman", /obj/structure/statue/snow/snowman, 5, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_ENTERTAINMENT), \ - new/datum/stack_recipe("snowball", /obj/item/toy/snowball, 1, check_density = FALSE, category = CAT_WEAPON_RANGED), \ - new/datum/stack_recipe("snow tile", /obj/item/stack/tile/mineral/snow, 1, 4, 20, check_density = FALSE, category = CAT_TILES), \ + new/datum/stack_recipe("snow wall", /turf/closed/wall/mineral/snow, 5, time = 4 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("snowman", /obj/structure/statue/snow/snowman, 5, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_ENTERTAINMENT), \ + new/datum/stack_recipe("snowball", /obj/item/toy/snowball, 1, crafting_flags = NONE, category = CAT_WEAPON_RANGED), \ + new/datum/stack_recipe("snow tile", /obj/item/stack/tile/mineral/snow, 1, 4, 20, crafting_flags = NONE, category = CAT_TILES), \ )) /obj/item/stack/sheet/mineral/snow/Initialize(mapload, new_amount, merge, list/mat_override, mat_amt) @@ -421,12 +421,12 @@ GLOBAL_LIST_INIT(adamantine_recipes, list( walltype = /turf/closed/wall/mineral/abductor GLOBAL_LIST_INIT(abductor_recipes, list ( \ - new/datum/stack_recipe("alien bed", /obj/structure/bed/abductor, 2, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ - new/datum/stack_recipe("alien locker", /obj/structure/closet/abductor, 2, time = 2 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ - new/datum/stack_recipe("alien table frame", /obj/structure/table_frame/abductor, 1, time = 2 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ - new/datum/stack_recipe("alien airlock assembly", /obj/structure/door_assembly/door_assembly_abductor, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \ + new/datum/stack_recipe("alien bed", /obj/structure/bed/abductor, 2, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ + new/datum/stack_recipe("alien locker", /obj/structure/closet/abductor, 2, time = 2 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ + new/datum/stack_recipe("alien table frame", /obj/structure/table_frame/abductor, 1, time = 2 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ + new/datum/stack_recipe("alien airlock assembly", /obj/structure/door_assembly/door_assembly_abductor, 4, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), \ null, \ - new/datum/stack_recipe("alien floor tile", /obj/item/stack/tile/mineral/abductor, 1, 4, 20, check_density = FALSE, category = CAT_TILES), \ + new/datum/stack_recipe("alien floor tile", /obj/item/stack/tile/mineral/abductor, 1, 4, 20, crafting_flags = NONE, category = CAT_TILES), \ )) /obj/item/stack/sheet/mineral/abductor/get_main_recipes() @@ -469,10 +469,10 @@ GLOBAL_LIST_INIT(abductor_recipes, list ( \ //Metal Hydrogen GLOBAL_LIST_INIT(metalhydrogen_recipes, list( - new /datum/stack_recipe("incomplete servant golem shell", /obj/item/golem_shell/servant, req_amount=20, res_amount=1, check_density = FALSE, category = CAT_ROBOT), - new /datum/stack_recipe("ancient armor", /obj/item/clothing/suit/armor/elder_atmosian, req_amount = 5, res_amount = 1, check_density = FALSE, category = CAT_CLOTHING), - new /datum/stack_recipe("ancient helmet", /obj/item/clothing/head/helmet/elder_atmosian, req_amount = 3, res_amount = 1, check_density = FALSE, category = CAT_CLOTHING), - new /datum/stack_recipe("metallic hydrogen axe", /obj/item/fireaxe/metal_h2_axe, req_amount = 15, res_amount = 1, check_density = FALSE, category = CAT_WEAPON_MELEE), + new /datum/stack_recipe("incomplete servant golem shell", /obj/item/golem_shell/servant, req_amount=20, res_amount=1, crafting_flags = NONE, category = CAT_ROBOT), + new /datum/stack_recipe("ancient armor", /obj/item/clothing/suit/armor/elder_atmosian, req_amount = 5, res_amount = 1, crafting_flags = NONE, category = CAT_CLOTHING), + new /datum/stack_recipe("ancient helmet", /obj/item/clothing/head/helmet/elder_atmosian, req_amount = 3, res_amount = 1, crafting_flags = NONE, category = CAT_CLOTHING), + new /datum/stack_recipe("metallic hydrogen axe", /obj/item/fireaxe/metal_h2_axe, req_amount = 15, res_amount = 1, crafting_flags = NONE, category = CAT_WEAPON_MELEE), )) /obj/item/stack/sheet/mineral/metal_hydrogen diff --git a/code/game/objects/items/stacks/sheets/runed_metal.dm b/code/game/objects/items/stacks/sheets/runed_metal.dm index b60cd67d389..44094a0bf78 100644 --- a/code/game/objects/items/stacks/sheets/runed_metal.dm +++ b/code/game/objects/items/stacks/sheets/runed_metal.dm @@ -6,8 +6,7 @@ GLOBAL_LIST_INIT(runed_metal_recipes, list( \ result_type = /obj/structure/destructible/cult/pylon, \ req_amount = 4, \ time = 4 SECONDS, \ - one_per_turf = TRUE, \ - on_solid_ground = TRUE, \ + crafting_flags = CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, \ desc = span_cult_bold("Pylon: Heals and regenerates the blood of nearby blood cultists and constructs, and also \ converts nearby floor tiles into engraved flooring, which allows blood cultists to scribe runes faster."), \ required_noun = "runed metal sheet", \ @@ -18,8 +17,7 @@ GLOBAL_LIST_INIT(runed_metal_recipes, list( \ result_type = /obj/structure/destructible/cult/item_dispenser/altar, \ req_amount = 3, \ time = 4 SECONDS, \ - one_per_turf = TRUE, \ - on_solid_ground = TRUE, \ + crafting_flags = CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, \ desc = span_cult_bold("Altar: Can make Eldritch Whetstones, Construct Shells, and Flasks of Unholy Water."), \ required_noun = "runed metal sheet", \ category = CAT_CULT, \ @@ -29,8 +27,7 @@ GLOBAL_LIST_INIT(runed_metal_recipes, list( \ result_type = /obj/structure/destructible/cult/item_dispenser/archives, \ req_amount = 3, \ time = 4 SECONDS, \ - one_per_turf = TRUE, \ - on_solid_ground = TRUE, \ + crafting_flags = CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, \ desc = span_cult_bold("Archives: Can make Zealot's Blindfolds, Shuttle Curse Orbs, \ and Veil Walker equipment. Emits Light."), \ required_noun = "runed metal sheet", \ @@ -41,8 +38,7 @@ GLOBAL_LIST_INIT(runed_metal_recipes, list( \ result_type = /obj/structure/destructible/cult/item_dispenser/forge, \ req_amount = 3, \ time = 4 SECONDS, \ - one_per_turf = TRUE, \ - on_solid_ground = TRUE, \ + crafting_flags = CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, \ desc = span_cult_bold("Daemon Forge: Can make Nar'Sien Hardened Armor, Flagellant's Robes, \ and Eldritch Longswords. Emits Light."), \ required_noun = "runed metal sheet", \ @@ -52,8 +48,7 @@ GLOBAL_LIST_INIT(runed_metal_recipes, list( \ title = "runed door", \ result_type = /obj/machinery/door/airlock/cult, \ time = 5 SECONDS, \ - one_per_turf = TRUE, \ - on_solid_ground = TRUE, \ + crafting_flags = CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, \ desc = span_cult_bold("Runed Door: A weak door which stuns non-blood cultists who touch it."), \ required_noun = "runed metal sheet", \ category = CAT_CULT, \ @@ -62,9 +57,9 @@ GLOBAL_LIST_INIT(runed_metal_recipes, list( \ title = "runed girder", \ result_type = /obj/structure/girder/cult, \ time = 5 SECONDS, \ - one_per_turf = TRUE, \ - on_solid_ground = TRUE, \ - desc = span_cult_bold("Runed Girder: A weak girder that can be instantly destroyed by ritual daggers. Not a recommended usage of runed metal."), \ + crafting_flags = CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, \ + desc = span_cult_bold("Runed Girder: A weak girder that can be instantly destroyed by ritual daggers. \ + Not a recommended usage of runed metal."), \ required_noun = "runed metal sheet", \ category = CAT_CULT, \ ), \ diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 887561b1043..d2f69047077 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -15,65 +15,66 @@ * Iron */ GLOBAL_LIST_INIT(metal_recipes, list ( \ - new/datum/stack_recipe("stool", /obj/structure/chair/stool, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ - new/datum/stack_recipe("bar stool", /obj/structure/chair/stool/bar, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ - new/datum/stack_recipe("bed", /obj/structure/bed, 2, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ - new/datum/stack_recipe("double bed", /obj/structure/bed/double, 4, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ + new/datum/stack_recipe("stool", /obj/structure/chair/stool, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ + new/datum/stack_recipe("bar stool", /obj/structure/chair/stool/bar, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ + new/datum/stack_recipe("bed", /obj/structure/bed, 2, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ + new/datum/stack_recipe("double bed", /obj/structure/bed/double, 4, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ null, \ new/datum/stack_recipe_list("office chairs", list( \ - new/datum/stack_recipe("dark office chair", /obj/structure/chair/office, 5, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ - new/datum/stack_recipe("light office chair", /obj/structure/chair/office/light, 5, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ + new/datum/stack_recipe("dark office chair", /obj/structure/chair/office, 5, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ + new/datum/stack_recipe("light office chair", /obj/structure/chair/office/light, 5, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ )), \ new/datum/stack_recipe_list("comfy chairs", list( \ - new/datum/stack_recipe("beige comfy chair", /obj/structure/chair/comfy/beige, 2, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ - new/datum/stack_recipe("black comfy chair", /obj/structure/chair/comfy/black, 2, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ - new/datum/stack_recipe("brown comfy chair", /obj/structure/chair/comfy/brown, 2, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ - new/datum/stack_recipe("lime comfy chair", /obj/structure/chair/comfy/lime, 2, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ - new/datum/stack_recipe("teal comfy chair", /obj/structure/chair/comfy/teal, 2, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ + new/datum/stack_recipe("beige comfy chair", /obj/structure/chair/comfy/beige, 2, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ + new/datum/stack_recipe("black comfy chair", /obj/structure/chair/comfy/black, 2, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ + new/datum/stack_recipe("brown comfy chair", /obj/structure/chair/comfy/brown, 2, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ + new/datum/stack_recipe("lime comfy chair", /obj/structure/chair/comfy/lime, 2, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ + new/datum/stack_recipe("teal comfy chair", /obj/structure/chair/comfy/teal, 2, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ )), \ new/datum/stack_recipe_list("sofas", list( - new /datum/stack_recipe("sofa (middle)", /obj/structure/chair/sofa/middle, 1, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), - new /datum/stack_recipe("sofa (left)", /obj/structure/chair/sofa/left, 1, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), - new /datum/stack_recipe("sofa (right)", /obj/structure/chair/sofa/right, 1, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), - new /datum/stack_recipe("sofa (corner)", /obj/structure/chair/sofa/corner, 1, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE) + new /datum/stack_recipe("sofa (middle)", /obj/structure/chair/sofa/middle, 1, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), + new /datum/stack_recipe("sofa (left)", /obj/structure/chair/sofa/left, 1, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), + new /datum/stack_recipe("sofa (right)", /obj/structure/chair/sofa/right, 1, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), + new /datum/stack_recipe("sofa (corner)", /obj/structure/chair/sofa/corner, 1, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE) )), \ new/datum/stack_recipe_list("corporate sofas", list( \ - new /datum/stack_recipe("sofa (middle)", /obj/structure/chair/sofa/corp, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ - new /datum/stack_recipe("sofa (left)", /obj/structure/chair/sofa/corp/left, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ - new /datum/stack_recipe("sofa (right)", /obj/structure/chair/sofa/corp/right, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ - new /datum/stack_recipe("sofa (corner)", /obj/structure/chair/sofa/corp/corner, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ + new /datum/stack_recipe("sofa (middle)", /obj/structure/chair/sofa/corp, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ + new /datum/stack_recipe("sofa (left)", /obj/structure/chair/sofa/corp/left, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ + new /datum/stack_recipe("sofa (right)", /obj/structure/chair/sofa/corp/right, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ + new /datum/stack_recipe("sofa (corner)", /obj/structure/chair/sofa/corp/corner, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ )), \ new /datum/stack_recipe_list("benches", list( \ - new /datum/stack_recipe("bench (middle)", /obj/structure/chair/sofa/bench, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ - new /datum/stack_recipe("bench (left)", /obj/structure/chair/sofa/bench/left, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ - new /datum/stack_recipe("bench (right)", /obj/structure/chair/sofa/bench/right, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ - new /datum/stack_recipe("bench (corner)", /obj/structure/chair/sofa/bench/corner, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ - new /datum/stack_recipe("tram bench (solo)", /obj/structure/chair/sofa/bench/tram/solo, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ - new /datum/stack_recipe("tram bench (middle)", /obj/structure/chair/sofa/bench/tram, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ - new /datum/stack_recipe("tram bench (left)", /obj/structure/chair/sofa/bench/tram/left, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ - new /datum/stack_recipe("tram bench (right)", /obj/structure/chair/sofa/bench/tram/right, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ - new /datum/stack_recipe("tram bench (corner)", /obj/structure/chair/sofa/bench/tram/corner, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ + new /datum/stack_recipe("bench (middle)", /obj/structure/chair/sofa/bench, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ + new /datum/stack_recipe("bench (left)", /obj/structure/chair/sofa/bench/left, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ + new /datum/stack_recipe("bench (right)", /obj/structure/chair/sofa/bench/right, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ + new /datum/stack_recipe("bench (corner)", /obj/structure/chair/sofa/bench/corner, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ + new /datum/stack_recipe("tram bench (solo)", /obj/structure/chair/sofa/bench/tram/solo, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ + new /datum/stack_recipe("tram bench (middle)", /obj/structure/chair/sofa/bench/tram, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ + new /datum/stack_recipe("tram bench (left)", /obj/structure/chair/sofa/bench/tram/left, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ + new /datum/stack_recipe("tram bench (right)", /obj/structure/chair/sofa/bench/tram/right, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ + new /datum/stack_recipe("tram bench (corner)", /obj/structure/chair/sofa/bench/tram/corner, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ )), \ new /datum/stack_recipe_list("chess pieces", list( \ - new /datum/stack_recipe("White Pawn", /obj/structure/chess/whitepawn, 2, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_ENTERTAINMENT), \ - new /datum/stack_recipe("White Rook", /obj/structure/chess/whiterook, 2, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_ENTERTAINMENT), \ - new /datum/stack_recipe("White Knight", /obj/structure/chess/whiteknight, 2, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_ENTERTAINMENT), \ - new /datum/stack_recipe("White Bishop", /obj/structure/chess/whitebishop, 2, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_ENTERTAINMENT), \ - new /datum/stack_recipe("White Queen", /obj/structure/chess/whitequeen, 2, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_ENTERTAINMENT), \ - new /datum/stack_recipe("White King", /obj/structure/chess/whiteking, 2, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_ENTERTAINMENT), \ - new /datum/stack_recipe("Black Pawn", /obj/structure/chess/blackpawn, 2, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_ENTERTAINMENT), \ - new /datum/stack_recipe("Black Rook", /obj/structure/chess/blackrook, 2, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_ENTERTAINMENT), \ - new /datum/stack_recipe("Black Knight", /obj/structure/chess/blackknight, 2, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_ENTERTAINMENT), \ - new /datum/stack_recipe("Black Bishop", /obj/structure/chess/blackbishop, 2, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_ENTERTAINMENT), \ - new /datum/stack_recipe("Black Queen", /obj/structure/chess/blackqueen, 2, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_ENTERTAINMENT), \ - new /datum/stack_recipe("Black King", /obj/structure/chess/blackking, 2, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_ENTERTAINMENT), \ + new /datum/stack_recipe("White Pawn", /obj/structure/chess/whitepawn, 2, time = 1 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_ENTERTAINMENT), \ + new /datum/stack_recipe("White Rook", /obj/structure/chess/whiterook, 2, time = 1 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_ENTERTAINMENT), \ + new /datum/stack_recipe("White Knight", /obj/structure/chess/whiteknight, 2, time = 1 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_ENTERTAINMENT), \ + new /datum/stack_recipe("White Bishop", /obj/structure/chess/whitebishop, 2, time = 1 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_ENTERTAINMENT), \ + new /datum/stack_recipe("White Queen", /obj/structure/chess/whitequeen, 2, time = 1 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_ENTERTAINMENT), \ + new /datum/stack_recipe("White King", /obj/structure/chess/whiteking, 2, time = 1 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_ENTERTAINMENT), \ + new /datum/stack_recipe("Black Pawn", /obj/structure/chess/blackpawn, 2, time = 1 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_ENTERTAINMENT), \ + new /datum/stack_recipe("Black Rook", /obj/structure/chess/blackrook, 2, time = 1 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_ENTERTAINMENT), \ + new /datum/stack_recipe("Black Knight", /obj/structure/chess/blackknight, 2, time = 1 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_ENTERTAINMENT), \ + new /datum/stack_recipe("Black Bishop", /obj/structure/chess/blackbishop, 2, time = 1 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_ENTERTAINMENT), \ + new /datum/stack_recipe("Black Queen", /obj/structure/chess/blackqueen, 2, time = 1 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_ENTERTAINMENT), \ + new /datum/stack_recipe("Black King", /obj/structure/chess/blackking, 2, time = 1 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_ENTERTAINMENT), \ )), new /datum/stack_recipe_list("checkers pieces", list( \ - new /datum/stack_recipe("White Checker Man", /obj/structure/chess/checker/whiteman, 2, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_ENTERTAINMENT), \ - new /datum/stack_recipe("White Checker King", /obj/structure/chess/checker/whiteking, 2, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_ENTERTAINMENT), \ - new /datum/stack_recipe("Black Checker Man", /obj/structure/chess/checker/blackman, 2, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_ENTERTAINMENT), \ - new /datum/stack_recipe("Black Checker King", /obj/structure/chess/checker/blackking, 2, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_ENTERTAINMENT), \ - )), \ + new /datum/stack_recipe("White Checker Man", /obj/structure/chess/checker/whiteman, 2, time = 1 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_ENTERTAINMENT), \ + new /datum/stack_recipe("White Checker King", /obj/structure/chess/checker/whiteking, 2, time = 1 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_ENTERTAINMENT), \ + new /datum/stack_recipe("Black Checker Man", /obj/structure/chess/checker/blackman, 2, time = 1 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_ENTERTAINMENT), \ + new /datum/stack_recipe("Black Checker King", /obj/structure/chess/checker/blackking, 2, time = 1 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_ENTERTAINMENT), \ + )), + null, \ //BUBBER EDIT BEGIN: ADDS CRAFTABLE SHELVES new /datum/stack_recipe_list("Racks and Shelves", list( \ new/datum/stack_recipe("rack parts", /obj/item/rack_parts, category = CAT_FURNITURE), \ @@ -82,67 +83,68 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ new/datum/stack_recipe("Shelf parts", /obj/item/rack_parts/shelf, 2, category = CAT_FURNITURE), \ )), null, \ + /* new/datum/stack_recipe("rack parts", /obj/item/rack_parts, category = CAT_FURNITURE), \*/ //BUBBER EDIT END: ADDS CRAFTABLE SHELVES - new/datum/stack_recipe("closet", /obj/structure/closet, 2, time = 1.5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ + new/datum/stack_recipe("closet", /obj/structure/closet, 2, time = 1.5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ null, \ - new/datum/stack_recipe("atmos canister", /obj/machinery/portable_atmospherics/canister, 10, time = 3 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_ATMOSPHERIC), \ - new/datum/stack_recipe("pipe", /obj/item/pipe/quaternary/pipe/crafted, 1, time = 4 SECONDS, check_density = FALSE, category = CAT_ATMOSPHERIC), \ + new/datum/stack_recipe("atmos canister", /obj/machinery/portable_atmospherics/canister, 10, time = 3 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_ATMOSPHERIC), \ + new/datum/stack_recipe("pipe", /obj/item/pipe/quaternary/pipe/crafted, 1, time = 4 SECONDS, crafting_flags = NONE, category = CAT_ATMOSPHERIC), \ null, \ new/datum/stack_recipe("floor tile", /obj/item/stack/tile/iron/base, 1, 4, 20, category = CAT_TILES), \ new/datum/stack_recipe("iron rod", /obj/item/stack/rods, 1, 2, 60, category = CAT_MISC), \ null, \ - new/datum/stack_recipe("wall girders (anchored)", /obj/structure/girder, 2, time = 4 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, placement_checks = STACK_CHECK_TRAM_FORBIDDEN, trait_booster = TRAIT_QUICK_BUILD, trait_modifier = 0.75, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("wall girders (anchored)", /obj/structure/girder, 2, time = 4 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, placement_checks = STACK_CHECK_TRAM_FORBIDDEN, trait_booster = TRAIT_QUICK_BUILD, trait_modifier = 0.75, category = CAT_STRUCTURE), \ null, \ null, \ - new/datum/stack_recipe("computer frame", /obj/structure/frame/computer, 5, time = 2.5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_EQUIPMENT), \ - new/datum/stack_recipe("modular console", /obj/machinery/modular_computer, 10, time = 2.5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_EQUIPMENT), \ - new/datum/stack_recipe("machine frame", /obj/structure/frame/machine, 5, time = 2.5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_EQUIPMENT), \ + new/datum/stack_recipe("computer frame", /obj/structure/frame/computer, 5, time = 2.5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_EQUIPMENT), \ + new/datum/stack_recipe("modular console", /obj/machinery/modular_computer, 10, time = 2.5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_EQUIPMENT), \ + new/datum/stack_recipe("machine frame", /obj/structure/frame/machine, 5, time = 2.5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_EQUIPMENT), \ null, \ new /datum/stack_recipe_list("airlock assemblies", list( \ - new /datum/stack_recipe("standard airlock assembly", /obj/structure/door_assembly, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \ - new /datum/stack_recipe("public airlock assembly", /obj/structure/door_assembly/door_assembly_public, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \ - new /datum/stack_recipe("command airlock assembly", /obj/structure/door_assembly/door_assembly_com, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \ - new /datum/stack_recipe("security airlock assembly", /obj/structure/door_assembly/door_assembly_sec, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \ - new /datum/stack_recipe("engineering airlock assembly", /obj/structure/door_assembly/door_assembly_eng, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \ - new /datum/stack_recipe("mining airlock assembly", /obj/structure/door_assembly/door_assembly_min, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \ - new /datum/stack_recipe("atmospherics airlock assembly", /obj/structure/door_assembly/door_assembly_atmo, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \ - new /datum/stack_recipe("research airlock assembly", /obj/structure/door_assembly/door_assembly_research, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \ - new /datum/stack_recipe("freezer airlock assembly", /obj/structure/door_assembly/door_assembly_fre, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \ - new /datum/stack_recipe("science airlock assembly", /obj/structure/door_assembly/door_assembly_science, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \ - new /datum/stack_recipe("medical airlock assembly", /obj/structure/door_assembly/door_assembly_med, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \ - new /datum/stack_recipe("hydroponics airlock assembly", /obj/structure/door_assembly/door_assembly_hydro, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \ - new /datum/stack_recipe("virology airlock assembly", /obj/structure/door_assembly/door_assembly_viro, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \ - new /datum/stack_recipe("maintenance airlock assembly", /obj/structure/door_assembly/door_assembly_mai, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \ - new /datum/stack_recipe("external airlock assembly", /obj/structure/door_assembly/door_assembly_ext, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \ - new /datum/stack_recipe("external maintenance airlock assembly", /obj/structure/door_assembly/door_assembly_extmai, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \ - new /datum/stack_recipe("airtight hatch assembly", /obj/structure/door_assembly/door_assembly_hatch, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \ - new /datum/stack_recipe("maintenance hatch assembly", /obj/structure/door_assembly/door_assembly_mhatch, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \ + new /datum/stack_recipe("standard airlock assembly", /obj/structure/door_assembly, 4, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), \ + new /datum/stack_recipe("public airlock assembly", /obj/structure/door_assembly/door_assembly_public, 4, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), \ + new /datum/stack_recipe("command airlock assembly", /obj/structure/door_assembly/door_assembly_com, 4, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), \ + new /datum/stack_recipe("security airlock assembly", /obj/structure/door_assembly/door_assembly_sec, 4, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), \ + new /datum/stack_recipe("engineering airlock assembly", /obj/structure/door_assembly/door_assembly_eng, 4, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), \ + new /datum/stack_recipe("mining airlock assembly", /obj/structure/door_assembly/door_assembly_min, 4, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), \ + new /datum/stack_recipe("atmospherics airlock assembly", /obj/structure/door_assembly/door_assembly_atmo, 4, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), \ + new /datum/stack_recipe("research airlock assembly", /obj/structure/door_assembly/door_assembly_research, 4, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), \ + new /datum/stack_recipe("freezer airlock assembly", /obj/structure/door_assembly/door_assembly_fre, 4, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), \ + new /datum/stack_recipe("science airlock assembly", /obj/structure/door_assembly/door_assembly_science, 4, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), \ + new /datum/stack_recipe("medical airlock assembly", /obj/structure/door_assembly/door_assembly_med, 4, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), \ + new /datum/stack_recipe("hydroponics airlock assembly", /obj/structure/door_assembly/door_assembly_hydro, 4, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), \ + new /datum/stack_recipe("virology airlock assembly", /obj/structure/door_assembly/door_assembly_viro, 4, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), \ + new /datum/stack_recipe("maintenance airlock assembly", /obj/structure/door_assembly/door_assembly_mai, 4, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), \ + new /datum/stack_recipe("external airlock assembly", /obj/structure/door_assembly/door_assembly_ext, 4, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), \ + new /datum/stack_recipe("external maintenance airlock assembly", /obj/structure/door_assembly/door_assembly_extmai, 4, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), \ + new /datum/stack_recipe("airtight hatch assembly", /obj/structure/door_assembly/door_assembly_hatch, 4, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), \ + new /datum/stack_recipe("maintenance hatch assembly", /obj/structure/door_assembly/door_assembly_mhatch, 4, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), \ )), \ null, \ - new/datum/stack_recipe("firelock frame", /obj/structure/firelock_frame, 3, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \ - new/datum/stack_recipe("turret frame", /obj/machinery/porta_turret_construct, 5, time = 2.5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_EQUIPMENT), \ - new/datum/stack_recipe("meatspike frame", /obj/structure/kitchenspike_frame, 5, time = 2.5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_EQUIPMENT), \ - new/datum/stack_recipe("reflector frame", /obj/structure/reflector, 5, time = 2.5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_EQUIPMENT), \ + new/datum/stack_recipe("firelock frame", /obj/structure/firelock_frame, 3, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), \ + new/datum/stack_recipe("turret frame", /obj/machinery/porta_turret_construct, 5, time = 2.5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_EQUIPMENT), \ + new/datum/stack_recipe("meatspike frame", /obj/structure/kitchenspike_frame, 5, time = 2.5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_EQUIPMENT), \ + new/datum/stack_recipe("reflector frame", /obj/structure/reflector, 5, time = 2.5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_EQUIPMENT), \ null, \ - new/datum/stack_recipe("grenade casing", /obj/item/grenade/chem_grenade, check_density = FALSE, category = CAT_CHEMISTRY), \ - new/datum/stack_recipe("light fixture frame", /obj/item/wallframe/light_fixture, 2, check_density = FALSE, category = CAT_EQUIPMENT), \ - new/datum/stack_recipe("small light fixture frame", /obj/item/wallframe/light_fixture/small, 1, check_density = FALSE, category = CAT_EQUIPMENT), \ + new/datum/stack_recipe("grenade casing", /obj/item/grenade/chem_grenade, crafting_flags = NONE, category = CAT_CHEMISTRY), \ + new/datum/stack_recipe("light fixture frame", /obj/item/wallframe/light_fixture, 2, crafting_flags = NONE, category = CAT_EQUIPMENT), \ + new/datum/stack_recipe("small light fixture frame", /obj/item/wallframe/light_fixture/small, 1, crafting_flags = NONE, category = CAT_EQUIPMENT), \ null, \ - new/datum/stack_recipe("apc frame", /obj/item/wallframe/apc, 2, check_density = FALSE, category = CAT_EQUIPMENT), \ - new/datum/stack_recipe("air alarm frame", /obj/item/wallframe/airalarm, 2, check_density = FALSE, category = CAT_EQUIPMENT), \ - new/datum/stack_recipe("fire alarm frame", /obj/item/wallframe/firealarm, 2, check_density = FALSE, category = CAT_EQUIPMENT), \ - new/datum/stack_recipe("extinguisher cabinet frame", /obj/item/wallframe/extinguisher_cabinet, 2, check_density = FALSE, category = CAT_EQUIPMENT), \ - new/datum/stack_recipe("button frame", /obj/item/wallframe/button, 1, check_density = FALSE, category = CAT_EQUIPMENT), \ + new/datum/stack_recipe("apc frame", /obj/item/wallframe/apc, 2, crafting_flags = NONE, category = CAT_EQUIPMENT), \ + new/datum/stack_recipe("air alarm frame", /obj/item/wallframe/airalarm, 2, crafting_flags = NONE, category = CAT_EQUIPMENT), \ + new/datum/stack_recipe("fire alarm frame", /obj/item/wallframe/firealarm, 2, crafting_flags = NONE, category = CAT_EQUIPMENT), \ + new/datum/stack_recipe("extinguisher cabinet frame", /obj/item/wallframe/extinguisher_cabinet, 2, crafting_flags = NONE, category = CAT_EQUIPMENT), \ + new/datum/stack_recipe("button frame", /obj/item/wallframe/button, 1, crafting_flags = NONE, category = CAT_EQUIPMENT), \ null, \ - new/datum/stack_recipe("iron door", /obj/structure/mineral_door/iron, 20, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, applies_mats = TRUE, category = CAT_DOORS), \ - new/datum/stack_recipe("filing cabinet", /obj/structure/filingcabinet, 2, time = 10 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ - new/datum/stack_recipe("desk bell", /obj/structure/desk_bell, 2, time = 3 SECONDS, check_density = FALSE, category = CAT_FURNITURE), \ - new/datum/stack_recipe("floodlight frame", /obj/structure/floodlight_frame, 5, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_EQUIPMENT), \ - new/datum/stack_recipe("voting box", /obj/structure/votebox, 15, time = 5 SECONDS, check_density = FALSE, category = CAT_ENTERTAINMENT), \ - new/datum/stack_recipe("pestle", /obj/item/pestle, 1, time = 5 SECONDS, check_density = FALSE, category = CAT_CHEMISTRY), \ - new/datum/stack_recipe("hygienebot assembly", /obj/item/bot_assembly/hygienebot, 2, time = 5 SECONDS, check_density = FALSE, category = CAT_ROBOT), \ - new/datum/stack_recipe("shower frame", /obj/structure/showerframe, 2, time = 2 SECONDS, check_density = FALSE, category = CAT_FURNITURE), \ - new/datum/stack_recipe("urinal", /obj/item/wallframe/urinal, 2, time = 1 SECONDS, check_density = FALSE, category = CAT_FURNITURE) + new/datum/stack_recipe("iron door", /obj/structure/mineral_door/iron, 20, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND | CRAFT_APPLIES_MATS, category = CAT_DOORS), \ + new/datum/stack_recipe("filing cabinet", /obj/structure/filingcabinet, 2, time = 10 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ + new/datum/stack_recipe("desk bell", /obj/structure/desk_bell, 2, time = 3 SECONDS, crafting_flags = NONE, category = CAT_FURNITURE), \ + new/datum/stack_recipe("floodlight frame", /obj/structure/floodlight_frame, 5, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_EQUIPMENT), \ + new/datum/stack_recipe("voting box", /obj/structure/votebox, 15, time = 5 SECONDS, crafting_flags = NONE, category = CAT_ENTERTAINMENT), \ + new/datum/stack_recipe("pestle", /obj/item/pestle, 1, time = 5 SECONDS, crafting_flags = NONE, category = CAT_CHEMISTRY), \ + new/datum/stack_recipe("hygienebot assembly", /obj/item/bot_assembly/hygienebot, 2, time = 5 SECONDS, crafting_flags = NONE, category = CAT_ROBOT), \ + new/datum/stack_recipe("shower frame", /obj/structure/showerframe, 2, time = 2 SECONDS, crafting_flags = NONE, category = CAT_FURNITURE), \ + new/datum/stack_recipe("urinal", /obj/item/wallframe/urinal, 2, time = 1 SECONDS, crafting_flags = NONE, category = CAT_FURNITURE) )) /obj/item/stack/sheet/iron @@ -260,14 +262,14 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ * Plasteel */ GLOBAL_LIST_INIT(plasteel_recipes, list ( \ - new/datum/stack_recipe("AI core", /obj/structure/ai_core, 4, time = 5 SECONDS, one_per_turf = TRUE, check_density = FALSE, category = CAT_ROBOT), - new/datum/stack_recipe("bomb assembly", /obj/machinery/syndicatebomb/empty, 10, time = 5 SECONDS, check_density = FALSE, category = CAT_CHEMISTRY), - new/datum/stack_recipe("Large Gas Tank", /obj/structure/tank_frame, 4, time=1 SECONDS, one_per_turf=TRUE, check_density = FALSE, category = CAT_ATMOSPHERIC), - new/datum/stack_recipe("shutter assembly", /obj/machinery/door/poddoor/shutters/preopen/deconstructed, 5, time = 5 SECONDS, one_per_turf = TRUE, check_density = FALSE, category = CAT_DOORS), + new/datum/stack_recipe("AI core", /obj/structure/ai_core, 4, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF, category = CAT_ROBOT), + new/datum/stack_recipe("bomb assembly", /obj/machinery/syndicatebomb/empty, 10, time = 5 SECONDS, crafting_flags = NONE, category = CAT_CHEMISTRY), + new/datum/stack_recipe("Large Gas Tank", /obj/structure/tank_frame, 4, time=1 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF, category = CAT_ATMOSPHERIC), + new/datum/stack_recipe("shutter assembly", /obj/machinery/door/poddoor/shutters/preopen/deconstructed, 5, time = 5 SECONDS, crafting_flags = CRAFT_ONE_PER_TURF, category = CAT_DOORS), null, new /datum/stack_recipe_list("airlock assemblies", list( \ - new/datum/stack_recipe("high security airlock assembly", /obj/structure/door_assembly/door_assembly_highsecurity, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), - new/datum/stack_recipe("vault door assembly", /obj/structure/door_assembly/door_assembly_vault, 6, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), + new/datum/stack_recipe("high security airlock assembly", /obj/structure/door_assembly/door_assembly_highsecurity, 4, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), + new/datum/stack_recipe("vault door assembly", /obj/structure/door_assembly/door_assembly_vault, 6, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), )), \ )) @@ -308,6 +310,7 @@ GLOBAL_LIST_INIT(plasteel_recipes, list ( \ * Wood */ GLOBAL_LIST_INIT(wood_recipes, list ( \ +<<<<<<< HEAD new/datum/stack_recipe("wooden sandals", /obj/item/clothing/shoes/sandal, 1, check_density = FALSE, category = CAT_CLOTHING), \ new/datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20, check_density = FALSE, category = CAT_TILES), \ new/datum/stack_recipe("wood table frame", /obj/structure/table_frame/wood, 2, time = 1 SECONDS, check_density = FALSE, category = CAT_FURNITURE), \ @@ -316,46 +319,45 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \ new/datum/stack_recipe("winged wooden chair", /obj/structure/chair/wood/wings, 3, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ new/datum/stack_recipe("wooden barricade", /obj/structure/barricade/wooden, 5, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_STRUCTURE), \ new/datum/stack_recipe("wooden door", /obj/structure/mineral_door/wood, 10, time = 2 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \ - new/datum/stack_recipe("wooden stairs frame", /obj/structure/stairs_frame/wood, 10, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_STRUCTURE), \ - new/datum/stack_recipe("wooden fence", /obj/structure/railing/wooden_fence, 2, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_STRUCTURE), \ - new/datum/stack_recipe("cat house", /obj/structure/cat_house, 5, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_STRUCTURE), \ - new/datum/stack_recipe("chalkboard", /obj/structure/chalkboard, 20, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_STRUCTURE), /* BUBBER EDIT: ADDS CHALKBOARD CRAFT */ \ - new/datum/stack_recipe("coffin", /obj/structure/closet/crate/coffin, 5, time = 1.5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ - new/datum/stack_recipe("book case", /obj/structure/bookcase, 4, time = 1.5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ - new/datum/stack_recipe("drying rack", /obj/machinery/smartfridge/drying_rack, 10, time = 1.5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_TOOLS), \ - new/datum/stack_recipe("wooden barrel", /obj/structure/fermenting_barrel, 8, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_CONTAINERS), \ - new/datum/stack_recipe("dog bed", /obj/structure/bed/dogbed, 10, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ - new/datum/stack_recipe("dresser", /obj/structure/dresser, 10, time = 1.5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ - new/datum/stack_recipe("picture frame", /obj/item/wallframe/picture, 1, time = 1 SECONDS, check_density = FALSE, category = CAT_ENTERTAINMENT),\ - new/datum/stack_recipe("painting frame", /obj/item/wallframe/painting, 1, time = 1 SECONDS, check_density = FALSE, category = CAT_ENTERTAINMENT),\ - new/datum/stack_recipe("display case chassis", /obj/structure/displaycase_chassis, 5, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ - new/datum/stack_recipe("wooden buckler", /obj/item/shield/buckler, 20, time = 4 SECONDS, check_density = FALSE, category = CAT_EQUIPMENT), \ - new/datum/stack_recipe("apiary", /obj/structure/beebox, 40, time = 5 SECONDS, check_density = FALSE, category = CAT_TOOLS),\ - new/datum/stack_recipe("mannequin", /obj/structure/mannequin/wood, 25, time = 5 SECONDS, one_per_turf = TRUE, category = CAT_ENTERTAINMENT), \ - new/datum/stack_recipe("tiki mask", /obj/item/clothing/mask/gas/tiki_mask, 2, check_density = FALSE, category = CAT_CLOTHING), \ - new/datum/stack_recipe("smoking pipe", /obj/item/clothing/mask/cigarette/pipe, 2, check_density = FALSE, category = CAT_CLOTHING), \ - new/datum/stack_recipe("honey frame", /obj/item/honey_frame, 5, time = 1 SECONDS, check_density = FALSE, category = CAT_TOOLS),\ - new/datum/stack_recipe("wooden bucket", /obj/item/reagent_containers/cup/bucket/wooden, 3, time = 1 SECONDS, check_density = FALSE, category = CAT_CONTAINERS),\ - new/datum/stack_recipe("rake", /obj/item/cultivator/rake, 5, time = 1 SECONDS, check_density = FALSE, category = CAT_TOOLS),\ - new/datum/stack_recipe("ore box", /obj/structure/ore_box, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_CONTAINERS),\ - new/datum/stack_recipe("wooden crate", /obj/structure/closet/crate/wooden, 6, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE),\ - new/datum/stack_recipe("baseball bat", /obj/item/melee/baseball_bat, 5, time = 1.5 SECONDS, check_density = FALSE, category = CAT_WEAPON_MELEE),\ - new/datum/stack_recipe("loom", /obj/structure/loom, 10, time = 1.5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_TOOLS), \ - new/datum/stack_recipe("mortar", /obj/item/reagent_containers/cup/mortar, 3, check_density = FALSE, category = CAT_CHEMISTRY), \ - new/datum/stack_recipe("firebrand", /obj/item/match/firebrand, 2, time = 10 SECONDS, check_density = FALSE, category = CAT_TOOLS), \ - new/datum/stack_recipe("bonfire", /obj/structure/bonfire/player_made, 10, time = 6 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_TOOLS), /* SKYRAT EDIT - Pollution - ORIGINAL: /obj/structure/bonfire */ \ - new/datum/stack_recipe("easel", /obj/structure/easel, 5, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_ENTERTAINMENT), \ - new/datum/stack_recipe("noticeboard", /obj/item/wallframe/noticeboard, 1, time = 1 SECONDS, one_per_turf = FALSE, on_solid_ground = FALSE, check_density = FALSE, category = CAT_FURNITURE), \ - new/datum/stack_recipe("test tube rack", /obj/item/storage/test_tube_rack, 1, time = 1 SECONDS, check_density = FALSE, category = CAT_CHEMISTRY), \ + new/datum/stack_recipe("wooden fence", /obj/structure/railing/wooden_fence, 2, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("cat house", /obj/structure/cat_house, 5, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("chalkboard", /obj/structure/chalkboard, 20, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_STRUCTURE), /* BUBBER EDIT: ADDS CHALKBOARD CRAFT */ \ + new/datum/stack_recipe("coffin", /obj/structure/closet/crate/coffin, 5, time = 1.5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ + new/datum/stack_recipe("book case", /obj/structure/bookcase, 4, time = 1.5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ + new/datum/stack_recipe("drying rack", /obj/machinery/smartfridge/drying_rack, 10, time = 1.5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_TOOLS), \ + new/datum/stack_recipe("wooden barrel", /obj/structure/fermenting_barrel, 8, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_CONTAINERS), \ + new/datum/stack_recipe("dog bed", /obj/structure/bed/dogbed, 10, time = 1 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ + new/datum/stack_recipe("dresser", /obj/structure/dresser, 10, time = 1.5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ + new/datum/stack_recipe("picture frame", /obj/item/wallframe/picture, 1, time = 1 SECONDS, crafting_flags = NONE, category = CAT_ENTERTAINMENT),\ + new/datum/stack_recipe("painting frame", /obj/item/wallframe/painting, 1, time = 1 SECONDS, crafting_flags = NONE, category = CAT_ENTERTAINMENT),\ + new/datum/stack_recipe("display case chassis", /obj/structure/displaycase_chassis, 5, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ + new/datum/stack_recipe("wooden buckler", /obj/item/shield/buckler, 20, time = 4 SECONDS, crafting_flags = NONE, category = CAT_EQUIPMENT), \ + new/datum/stack_recipe("apiary", /obj/structure/beebox, 40, time = 5 SECONDS, crafting_flags = NONE, category = CAT_TOOLS),\ + new/datum/stack_recipe("mannequin", /obj/structure/mannequin/wood, 25, time = 5 SECONDS, crafting_flags = CRAFT_ONE_PER_TURF, category = CAT_ENTERTAINMENT), \ + new/datum/stack_recipe("tiki mask", /obj/item/clothing/mask/gas/tiki_mask, 2, crafting_flags = NONE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("smoking pipe", /obj/item/clothing/mask/cigarette/pipe, 2, crafting_flags = NONE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("honey frame", /obj/item/honey_frame, 5, time = 1 SECONDS, crafting_flags = NONE, category = CAT_TOOLS),\ + new/datum/stack_recipe("wooden bucket", /obj/item/reagent_containers/cup/bucket/wooden, 3, time = 1 SECONDS, crafting_flags = NONE, category = CAT_CONTAINERS),\ + new/datum/stack_recipe("rake", /obj/item/cultivator/rake, 5, time = 1 SECONDS, crafting_flags = NONE, category = CAT_TOOLS),\ + new/datum/stack_recipe("ore box", /obj/structure/ore_box, 4, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_CONTAINERS),\ + new/datum/stack_recipe("wooden crate", /obj/structure/closet/crate/wooden, 6, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE),\ + new/datum/stack_recipe("baseball bat", /obj/item/melee/baseball_bat, 5, time = 1.5 SECONDS, crafting_flags = NONE, category = CAT_WEAPON_MELEE),\ + new/datum/stack_recipe("loom", /obj/structure/loom, 10, time = 1.5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_TOOLS), \ + new/datum/stack_recipe("mortar", /obj/item/reagent_containers/cup/mortar, 3, crafting_flags = NONE, category = CAT_CHEMISTRY), \ + new/datum/stack_recipe("firebrand", /obj/item/match/firebrand, 2, time = 10 SECONDS, crafting_flags = NONE, category = CAT_TOOLS), \ + new/datum/stack_recipe("bonfire", /obj/structure/bonfire/player_made, 10, time = 6 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_TOOLS), /* SKYRAT EDIT - Pollution - ORIGINAL: /obj/structure/bonfire */ \ + new/datum/stack_recipe("easel", /obj/structure/easel, 5, time = 1 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_ENTERTAINMENT), \ + new/datum/stack_recipe("noticeboard", /obj/item/wallframe/noticeboard, 1, time = 1 SECONDS, crafting_flags = NONE, category = CAT_FURNITURE), \ + new/datum/stack_recipe("test tube rack", /obj/item/storage/test_tube_rack, 1, time = 1 SECONDS, crafting_flags = NONE, category = CAT_CHEMISTRY), \ +>>>>>>> cfe4d30a178d201eb3f01341a87f15129fe4aabb null, \ new/datum/stack_recipe_list("pews", list( - new /datum/stack_recipe("pew (middle)", /obj/structure/chair/pew, 3, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), - new /datum/stack_recipe("pew (left)", /obj/structure/chair/pew/left, 3, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), - new /datum/stack_recipe("pew (right)", /obj/structure/chair/pew/right, 3, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE) + new /datum/stack_recipe("pew (middle)", /obj/structure/chair/pew, 3, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), + new /datum/stack_recipe("pew (left)", /obj/structure/chair/pew/left, 3, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), + new /datum/stack_recipe("pew (right)", /obj/structure/chair/pew/right, 3, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE) )), null, \ )) - /obj/item/stack/sheet/mineral/wood name = "wooden plank" desc = "One can only guess that this is a bunch of wood." @@ -388,19 +390,19 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \ */ GLOBAL_LIST_INIT(bamboo_recipes, list ( \ - new/datum/stack_recipe("punji sticks trap", /obj/structure/punji_sticks, 5, time = 3 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_EQUIPMENT), \ - new/datum/stack_recipe("bamboo spear", /obj/item/spear/bamboospear, 25, time = 9 SECONDS, check_density = FALSE, category = CAT_WEAPON_MELEE), \ - new/datum/stack_recipe("blow gun", /obj/item/gun/syringe/blowgun, 10, time = 7 SECONDS, check_density = FALSE, category = CAT_WEAPON_RANGED), \ - new/datum/stack_recipe("crude syringe", /obj/item/reagent_containers/syringe/crude, 5, time = 1 SECONDS, check_density = FALSE, category = CAT_CHEMISTRY), \ - new/datum/stack_recipe("rice hat", /obj/item/clothing/head/costume/rice_hat, 10, time = 7 SECONDS, check_density = FALSE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("punji sticks trap", /obj/structure/punji_sticks, 5, time = 3 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_EQUIPMENT), \ + new/datum/stack_recipe("bamboo spear", /obj/item/spear/bamboospear, 25, time = 9 SECONDS, crafting_flags = NONE, category = CAT_WEAPON_MELEE), \ + new/datum/stack_recipe("blow gun", /obj/item/gun/syringe/blowgun, 10, time = 7 SECONDS, crafting_flags = NONE, category = CAT_WEAPON_RANGED), \ + new/datum/stack_recipe("crude syringe", /obj/item/reagent_containers/syringe/crude, 5, time = 1 SECONDS, crafting_flags = NONE, category = CAT_CHEMISTRY), \ + new/datum/stack_recipe("rice hat", /obj/item/clothing/head/costume/rice_hat, 10, time = 7 SECONDS, crafting_flags = NONE, category = CAT_CLOTHING), \ null, \ - new/datum/stack_recipe("bamboo stool", /obj/structure/chair/stool/bamboo, 2, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ - new/datum/stack_recipe("bamboo mat piece", /obj/item/stack/tile/bamboo, 1, 4, 20, check_density = FALSE, category = CAT_TILES), \ + new/datum/stack_recipe("bamboo stool", /obj/structure/chair/stool/bamboo, 2, time = 1 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ + new/datum/stack_recipe("bamboo mat piece", /obj/item/stack/tile/bamboo, 1, 4, 20, crafting_flags = NONE, category = CAT_TILES), \ null, \ new/datum/stack_recipe_list("bamboo benches", list( - new /datum/stack_recipe("bamboo bench (middle)", /obj/structure/chair/sofa/bamboo, 3, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), - new /datum/stack_recipe("bamboo bench (left)", /obj/structure/chair/sofa/bamboo/left, 3, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), - new /datum/stack_recipe("bamboo bench (right)", /obj/structure/chair/sofa/bamboo/right, 3, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE) + new /datum/stack_recipe("bamboo bench (middle)", /obj/structure/chair/sofa/bamboo, 3, time = 1 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), + new /datum/stack_recipe("bamboo bench (left)", /obj/structure/chair/sofa/bamboo/left, 3, time = 1 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), + new /datum/stack_recipe("bamboo bench (right)", /obj/structure/chair/sofa/bamboo/right, 3, time = 1 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE) )), \ )) @@ -435,41 +437,41 @@ GLOBAL_LIST_INIT(bamboo_recipes, list ( \ * Cloth */ GLOBAL_LIST_INIT(cloth_recipes, list ( \ - new/datum/stack_recipe("white jumpskirt", /obj/item/clothing/under/color/jumpskirt/white, 3, check_density = FALSE, category = CAT_CLOTHING), /*Ladies first*/ \ - new/datum/stack_recipe("white jumpsuit", /obj/item/clothing/under/color/white, 3, check_density = FALSE, category = CAT_CLOTHING), \ - new/datum/stack_recipe("white shoes", /obj/item/clothing/shoes/sneakers/white, 2, check_density = FALSE, category = CAT_CLOTHING), \ - new/datum/stack_recipe("white scarf", /obj/item/clothing/neck/scarf, 1, check_density = FALSE, category = CAT_CLOTHING), \ - new/datum/stack_recipe("white bandana", /obj/item/clothing/mask/bandana/white, 2, check_density = FALSE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("white jumpskirt", /obj/item/clothing/under/color/jumpskirt/white, 3, crafting_flags = NONE, category = CAT_CLOTHING), /*Ladies first*/ \ + new/datum/stack_recipe("white jumpsuit", /obj/item/clothing/under/color/white, 3, crafting_flags = NONE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("white shoes", /obj/item/clothing/shoes/sneakers/white, 2, crafting_flags = NONE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("white scarf", /obj/item/clothing/neck/scarf, 1, crafting_flags = NONE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("white bandana", /obj/item/clothing/mask/bandana/white, 2, crafting_flags = NONE, category = CAT_CLOTHING), \ null, \ - new/datum/stack_recipe("backpack", /obj/item/storage/backpack, 4, check_density = FALSE, category = CAT_CONTAINERS), \ - new/datum/stack_recipe("satchel", /obj/item/storage/backpack/satchel, 4, check_density = FALSE, category = CAT_CONTAINERS), \ - new/datum/stack_recipe("messenger bag", /obj/item/storage/backpack/messenger, 4, check_density = FALSE, category = CAT_CONTAINERS), \ - new/datum/stack_recipe("duffel bag", /obj/item/storage/backpack/duffelbag, 6, check_density = FALSE, category = CAT_CONTAINERS), \ + new/datum/stack_recipe("backpack", /obj/item/storage/backpack, 4, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new/datum/stack_recipe("satchel", /obj/item/storage/backpack/satchel, 4, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new/datum/stack_recipe("messenger bag", /obj/item/storage/backpack/messenger, 4, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new/datum/stack_recipe("duffel bag", /obj/item/storage/backpack/duffelbag, 6, crafting_flags = NONE, category = CAT_CONTAINERS), \ null, \ - new/datum/stack_recipe("plant bag", /obj/item/storage/bag/plants, 4, check_density = FALSE, category = CAT_CONTAINERS), \ - new/datum/stack_recipe("book bag", /obj/item/storage/bag/books, 4, check_density = FALSE, category = CAT_CONTAINERS), \ - new/datum/stack_recipe("mining satchel", /obj/item/storage/bag/ore, 4, check_density = FALSE, category = CAT_CONTAINERS), \ - new/datum/stack_recipe("chemistry bag", /obj/item/storage/bag/chemistry, 4, check_density = FALSE, category = CAT_CONTAINERS), \ - new/datum/stack_recipe("bio bag", /obj/item/storage/bag/bio, 4, check_density = FALSE, category = CAT_CONTAINERS), \ - new/datum/stack_recipe("science bag", /obj/item/storage/bag/xeno, 4, check_density = FALSE, category = CAT_CONTAINERS), \ - new/datum/stack_recipe("construction bag", /obj/item/storage/bag/construction, 4, check_density = FALSE, category = CAT_CONTAINERS), \ + new/datum/stack_recipe("plant bag", /obj/item/storage/bag/plants, 4, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new/datum/stack_recipe("book bag", /obj/item/storage/bag/books, 4, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new/datum/stack_recipe("mining satchel", /obj/item/storage/bag/ore, 4, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new/datum/stack_recipe("chemistry bag", /obj/item/storage/bag/chemistry, 4, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new/datum/stack_recipe("bio bag", /obj/item/storage/bag/bio, 4, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new/datum/stack_recipe("science bag", /obj/item/storage/bag/xeno, 4, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new/datum/stack_recipe("construction bag", /obj/item/storage/bag/construction, 4, crafting_flags = NONE, category = CAT_CONTAINERS), \ null, \ - new/datum/stack_recipe("improvised gauze", /obj/item/stack/medical/gauze/improvised, 1, 2, 6, check_density = FALSE, category = CAT_TOOLS), \ - new/datum/stack_recipe("rag", /obj/item/reagent_containers/cup/rag, 1, check_density = FALSE, category = CAT_CHEMISTRY), \ - new/datum/stack_recipe("bedsheet", /obj/item/bedsheet, 3, check_density = FALSE, category = CAT_FURNITURE), \ - new/datum/stack_recipe("double bedsheet", /obj/item/bedsheet/double, 6, check_density = FALSE, category = CAT_FURNITURE), \ - new/datum/stack_recipe("empty sandbag", /obj/item/emptysandbag, 4, check_density = FALSE, category = CAT_CONTAINERS), \ + new/datum/stack_recipe("improvised gauze", /obj/item/stack/medical/gauze/improvised, 1, 2, 6, crafting_flags = NONE, category = CAT_TOOLS), \ + new/datum/stack_recipe("rag", /obj/item/reagent_containers/cup/rag, 1, crafting_flags = NONE, category = CAT_CHEMISTRY), \ + new/datum/stack_recipe("bedsheet", /obj/item/bedsheet, 3, crafting_flags = NONE, category = CAT_FURNITURE), \ + new/datum/stack_recipe("double bedsheet", /obj/item/bedsheet/double, 6, crafting_flags = NONE, category = CAT_FURNITURE), \ + new/datum/stack_recipe("empty sandbag", /obj/item/emptysandbag, 4, crafting_flags = NONE, category = CAT_CONTAINERS), \ null, \ - new/datum/stack_recipe("fingerless gloves", /obj/item/clothing/gloves/fingerless, 1, check_density = FALSE, category = CAT_CLOTHING), \ - new/datum/stack_recipe("white gloves", /obj/item/clothing/gloves/color/white, 3, check_density = FALSE, category = CAT_CLOTHING), \ - new/datum/stack_recipe("white softcap", /obj/item/clothing/head/soft/mime, 2, check_density = FALSE, category = CAT_CLOTHING), \ - new/datum/stack_recipe("white beanie", /obj/item/clothing/head/beanie, 2, check_density = FALSE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("fingerless gloves", /obj/item/clothing/gloves/fingerless, 1, crafting_flags = NONE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("white gloves", /obj/item/clothing/gloves/color/white, 3, crafting_flags = NONE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("white softcap", /obj/item/clothing/head/soft/mime, 2, crafting_flags = NONE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("white beanie", /obj/item/clothing/head/beanie, 2, crafting_flags = NONE, category = CAT_CLOTHING), \ null, \ - new/datum/stack_recipe("blindfold", /obj/item/clothing/glasses/blindfold, 2, check_density = FALSE, category = CAT_ENTERTAINMENT), \ + new/datum/stack_recipe("blindfold", /obj/item/clothing/glasses/blindfold, 2, crafting_flags = NONE, category = CAT_ENTERTAINMENT), \ null, \ - new/datum/stack_recipe("19x19 canvas", /obj/item/canvas/nineteen_nineteen, 3, check_density = FALSE, category = CAT_ENTERTAINMENT), \ - new/datum/stack_recipe("23x19 canvas", /obj/item/canvas/twentythree_nineteen, 4, check_density = FALSE, category = CAT_ENTERTAINMENT), \ - new/datum/stack_recipe("23x23 canvas", /obj/item/canvas/twentythree_twentythree, 5, check_density = FALSE, category = CAT_ENTERTAINMENT), \ + new/datum/stack_recipe("19x19 canvas", /obj/item/canvas/nineteen_nineteen, 3, crafting_flags = NONE, category = CAT_ENTERTAINMENT), \ + new/datum/stack_recipe("23x19 canvas", /obj/item/canvas/twentythree_nineteen, 4, crafting_flags = NONE, category = CAT_ENTERTAINMENT), \ + new/datum/stack_recipe("23x23 canvas", /obj/item/canvas/twentythree_twentythree, 5, crafting_flags = NONE, category = CAT_ENTERTAINMENT), \ new/datum/stack_recipe("pillow", /obj/item/pillow, 3, category = CAT_FURNITURE), \ )) @@ -498,10 +500,10 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \ amount = 5 GLOBAL_LIST_INIT(durathread_recipes, list ( \ - new/datum/stack_recipe("durathread jumpsuit", /obj/item/clothing/under/misc/durathread, 4, time = 4 SECONDS, check_density = FALSE, category = CAT_CLOTHING), - new/datum/stack_recipe("durathread beret", /obj/item/clothing/head/beret/durathread, 2, time = 4 SECONDS, check_density = FALSE, category = CAT_CLOTHING), \ - new/datum/stack_recipe("durathread beanie", /obj/item/clothing/head/beanie/durathread, 2, time = 4 SECONDS, check_density = FALSE, category = CAT_CLOTHING), \ - new/datum/stack_recipe("durathread bandana", /obj/item/clothing/mask/bandana/durathread, 1, time = 2.5 SECONDS, check_density = FALSE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("durathread jumpsuit", /obj/item/clothing/under/misc/durathread, 4, time = 4 SECONDS, crafting_flags = NONE, category = CAT_CLOTHING), + new/datum/stack_recipe("durathread beret", /obj/item/clothing/head/beret/durathread, 2, time = 4 SECONDS, crafting_flags = NONE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("durathread beanie", /obj/item/clothing/head/beanie/durathread, 2, time = 4 SECONDS, crafting_flags = NONE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("durathread bandana", /obj/item/clothing/mask/bandana/durathread, 1, time = 2.5 SECONDS, crafting_flags = NONE, category = CAT_CLOTHING), \ )) /obj/item/stack/sheet/durathread @@ -572,61 +574,61 @@ GLOBAL_LIST_INIT(durathread_recipes, list ( \ * Cardboard */ GLOBAL_LIST_INIT(cardboard_recipes, list ( \ - new/datum/stack_recipe("box", /obj/item/storage/box, check_density = FALSE, category = CAT_CONTAINERS), \ - new/datum/stack_recipe("cardborg suit", /obj/item/clothing/suit/costume/cardborg, 3, check_density = FALSE, category = CAT_CLOTHING), \ - new/datum/stack_recipe("cardborg helmet", /obj/item/clothing/head/costume/cardborg, check_density = FALSE, category = CAT_CLOTHING), \ - new/datum/stack_recipe("large box", /obj/structure/closet/cardboard, 4, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_CONTAINERS), \ - new/datum/stack_recipe("cardboard cutout", /obj/item/cardboard_cutout, 5, check_density = FALSE, category = CAT_ENTERTAINMENT), \ + new/datum/stack_recipe("box", /obj/item/storage/box, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new/datum/stack_recipe("cardborg suit", /obj/item/clothing/suit/costume/cardborg, 3, crafting_flags = NONE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("cardborg helmet", /obj/item/clothing/head/costume/cardborg, crafting_flags = NONE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("large box", /obj/structure/closet/cardboard, 4, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_CONTAINERS), \ + new/datum/stack_recipe("cardboard cutout", /obj/item/cardboard_cutout, 5, crafting_flags = NONE, category = CAT_ENTERTAINMENT), \ null, \ - new/datum/stack_recipe("pizza box", /obj/item/pizzabox, check_density = FALSE, category = CAT_CONTAINERS), \ - new/datum/stack_recipe("folder", /obj/item/folder, check_density = FALSE, category = CAT_CONTAINERS), \ + new/datum/stack_recipe("pizza box", /obj/item/pizzabox, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new/datum/stack_recipe("folder", /obj/item/folder, crafting_flags = NONE, category = CAT_CONTAINERS), \ null, \ //TO-DO: Find a proper way to just change the illustration on the box. Code isn't the issue, input is. new/datum/stack_recipe_list("fancy boxes", list( - new /datum/stack_recipe("donut box", /obj/item/storage/fancy/donut_box, check_density = FALSE, category = CAT_CONTAINERS), \ - new /datum/stack_recipe("egg box", /obj/item/storage/fancy/egg_box, check_density = FALSE, category = CAT_CONTAINERS), \ - new /datum/stack_recipe("donk-pockets box", /obj/item/storage/box/donkpockets, check_density = FALSE, category = CAT_CONTAINERS), \ - new /datum/stack_recipe("donk-pockets spicy box", /obj/item/storage/box/donkpockets/donkpocketspicy, check_density = FALSE, category = CAT_CONTAINERS), \ - new /datum/stack_recipe("donk-pockets teriyaki box", /obj/item/storage/box/donkpockets/donkpocketteriyaki, check_density = FALSE, category = CAT_CONTAINERS), \ - new /datum/stack_recipe("donk-pockets pizza box", /obj/item/storage/box/donkpockets/donkpocketpizza, check_density = FALSE, category = CAT_CONTAINERS), \ - new /datum/stack_recipe("donk-pockets berry box", /obj/item/storage/box/donkpockets/donkpocketberry, check_density = FALSE, category = CAT_CONTAINERS), \ - new /datum/stack_recipe("donk-pockets honk box", /obj/item/storage/box/donkpockets/donkpockethonk, check_density = FALSE, category = CAT_CONTAINERS), \ - new /datum/stack_recipe("monkey cube box", /obj/item/storage/box/monkeycubes, check_density = FALSE, category = CAT_CONTAINERS), - new /datum/stack_recipe("nugget box", /obj/item/storage/fancy/nugget_box, check_density = FALSE, category = CAT_CONTAINERS), \ + new /datum/stack_recipe("donut box", /obj/item/storage/fancy/donut_box, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new /datum/stack_recipe("egg box", /obj/item/storage/fancy/egg_box, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new /datum/stack_recipe("donk-pockets box", /obj/item/storage/box/donkpockets, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new /datum/stack_recipe("donk-pockets spicy box", /obj/item/storage/box/donkpockets/donkpocketspicy, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new /datum/stack_recipe("donk-pockets teriyaki box", /obj/item/storage/box/donkpockets/donkpocketteriyaki, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new /datum/stack_recipe("donk-pockets pizza box", /obj/item/storage/box/donkpockets/donkpocketpizza, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new /datum/stack_recipe("donk-pockets berry box", /obj/item/storage/box/donkpockets/donkpocketberry, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new /datum/stack_recipe("donk-pockets honk box", /obj/item/storage/box/donkpockets/donkpockethonk, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new /datum/stack_recipe("monkey cube box", /obj/item/storage/box/monkeycubes, crafting_flags = NONE, category = CAT_CONTAINERS), + new /datum/stack_recipe("nugget box", /obj/item/storage/fancy/nugget_box, crafting_flags = NONE, category = CAT_CONTAINERS), \ null, \ - new /datum/stack_recipe("lethal ammo box", /obj/item/storage/box/lethalshot, check_density = FALSE, category = CAT_CONTAINERS), \ - new /datum/stack_recipe("rubber shot ammo box", /obj/item/storage/box/rubbershot, check_density = FALSE, category = CAT_CONTAINERS), \ - new /datum/stack_recipe("bean bag ammo box", /obj/item/storage/box/beanbag, check_density = FALSE, category = CAT_CONTAINERS), \ - new /datum/stack_recipe("flashbang box", /obj/item/storage/box/flashbangs, check_density = FALSE, category = CAT_CONTAINERS), \ - new /datum/stack_recipe("flashes box", /obj/item/storage/box/flashes, check_density = FALSE, category = CAT_CONTAINERS), \ - new /datum/stack_recipe("handcuffs box", /obj/item/storage/box/handcuffs, check_density = FALSE, category = CAT_CONTAINERS), \ - new /datum/stack_recipe("ID card box", /obj/item/storage/box/ids, check_density = FALSE, category = CAT_CONTAINERS), \ - new /datum/stack_recipe("PDA box", /obj/item/storage/box/pdas, check_density = FALSE, category = CAT_CONTAINERS), \ + new /datum/stack_recipe("lethal ammo box", /obj/item/storage/box/lethalshot, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new /datum/stack_recipe("rubber shot ammo box", /obj/item/storage/box/rubbershot, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new /datum/stack_recipe("bean bag ammo box", /obj/item/storage/box/beanbag, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new /datum/stack_recipe("flashbang box", /obj/item/storage/box/flashbangs, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new /datum/stack_recipe("flashes box", /obj/item/storage/box/flashes, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new /datum/stack_recipe("handcuffs box", /obj/item/storage/box/handcuffs, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new /datum/stack_recipe("ID card box", /obj/item/storage/box/ids, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new /datum/stack_recipe("PDA box", /obj/item/storage/box/pdas, crafting_flags = NONE, category = CAT_CONTAINERS), \ null, \ - new /datum/stack_recipe("pillbottle box", /obj/item/storage/box/pillbottles, check_density = FALSE, category = CAT_CONTAINERS), \ - new /datum/stack_recipe("beaker box", /obj/item/storage/box/beakers, check_density = FALSE, category = CAT_CONTAINERS), \ - new /datum/stack_recipe("syringe box", /obj/item/storage/box/syringes, check_density = FALSE, category = CAT_CONTAINERS), \ - new /datum/stack_recipe("latex gloves box", /obj/item/storage/box/gloves, check_density = FALSE, category = CAT_CONTAINERS), \ - new /datum/stack_recipe("sterile masks box", /obj/item/storage/box/masks, check_density = FALSE, category = CAT_CONTAINERS), \ - new /datum/stack_recipe("body bag box", /obj/item/storage/box/bodybags, check_density = FALSE, category = CAT_CONTAINERS), \ - new /datum/stack_recipe("perscription glasses box", /obj/item/storage/box/rxglasses, check_density = FALSE, category = CAT_CONTAINERS), \ - new /datum/stack_recipe("medipen box", /obj/item/storage/box/medipens, check_density = FALSE, category = CAT_CONTAINERS), \ - new /datum/stack_recipe("oxygen tank box", /obj/item/storage/box/emergencytank, check_density = FALSE, category = CAT_CONTAINERS), \ - new /datum/stack_recipe("extended oxygen tank box", /obj/item/storage/box/engitank, check_density = FALSE, category = CAT_CONTAINERS), \ + new /datum/stack_recipe("pillbottle box", /obj/item/storage/box/pillbottles, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new /datum/stack_recipe("beaker box", /obj/item/storage/box/beakers, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new /datum/stack_recipe("syringe box", /obj/item/storage/box/syringes, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new /datum/stack_recipe("latex gloves box", /obj/item/storage/box/gloves, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new /datum/stack_recipe("sterile masks box", /obj/item/storage/box/masks, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new /datum/stack_recipe("body bag box", /obj/item/storage/box/bodybags, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new /datum/stack_recipe("perscription glasses box", /obj/item/storage/box/rxglasses, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new /datum/stack_recipe("medipen box", /obj/item/storage/box/medipens, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new /datum/stack_recipe("oxygen tank box", /obj/item/storage/box/emergencytank, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new /datum/stack_recipe("extended oxygen tank box", /obj/item/storage/box/engitank, crafting_flags = NONE, category = CAT_CONTAINERS), \ null, \ - new /datum/stack_recipe("survival box", /obj/item/storage/box/survival/crafted, check_density = FALSE, category = CAT_CONTAINERS), \ - new /datum/stack_recipe("extended tank survival box", /obj/item/storage/box/survival/engineer/crafted, check_density = FALSE, category = CAT_CONTAINERS), \ - new /datum/stack_recipe("disk box", /obj/item/storage/box/disks, check_density = FALSE, category = CAT_CONTAINERS), \ - new /datum/stack_recipe("light tubes box", /obj/item/storage/box/lights/tubes, check_density = FALSE, category = CAT_CONTAINERS), \ - new /datum/stack_recipe("light bulbs box", /obj/item/storage/box/lights/bulbs, check_density = FALSE, category = CAT_CONTAINERS), \ - new /datum/stack_recipe("mixed lights box", /obj/item/storage/box/lights/mixed, check_density = FALSE, category = CAT_CONTAINERS), \ - new /datum/stack_recipe("mouse traps box", /obj/item/storage/box/mousetraps, check_density = FALSE, category = CAT_CONTAINERS), \ - new /datum/stack_recipe("candle box", /obj/item/storage/fancy/candle_box, check_density = FALSE, category = CAT_CONTAINERS), \ - new /datum/stack_recipe("bandage box", /obj/item/storage/box/bandages, check_density = FALSE, category = CAT_CONTAINERS) + new /datum/stack_recipe("survival box", /obj/item/storage/box/survival/crafted, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new /datum/stack_recipe("extended tank survival box", /obj/item/storage/box/survival/engineer/crafted, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new /datum/stack_recipe("disk box", /obj/item/storage/box/disks, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new /datum/stack_recipe("light tubes box", /obj/item/storage/box/lights/tubes, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new /datum/stack_recipe("light bulbs box", /obj/item/storage/box/lights/bulbs, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new /datum/stack_recipe("mixed lights box", /obj/item/storage/box/lights/mixed, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new /datum/stack_recipe("mouse traps box", /obj/item/storage/box/mousetraps, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new /datum/stack_recipe("candle box", /obj/item/storage/fancy/candle_box, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new /datum/stack_recipe("bandage box", /obj/item/storage/box/bandages, crafting_flags = NONE, category = CAT_CONTAINERS) )), null, \ @@ -684,18 +686,18 @@ GLOBAL_LIST_INIT(cardboard_recipes, list ( \ */ GLOBAL_LIST_INIT(bronze_recipes, list ( \ - new/datum/stack_recipe("wall gear", /obj/structure/girder/bronze, 2, time = 2 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("wall gear", /obj/structure/girder/bronze, 2, time = 2 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_STRUCTURE), \ null, - new/datum/stack_recipe("directional bronze window", /obj/structure/window/bronze/unanchored, time = 0, on_solid_ground = TRUE, check_direction = TRUE, category = CAT_WINDOWS), \ - new/datum/stack_recipe("fulltile bronze window", /obj/structure/window/bronze/fulltile/unanchored, 2, time = 0, on_solid_ground = TRUE, is_fulltile = TRUE, category = CAT_WINDOWS), \ - new/datum/stack_recipe("pinion airlock assembly", /obj/structure/door_assembly/door_assembly_bronze, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \ - new/datum/stack_recipe("bronze pinion airlock assembly", /obj/structure/door_assembly/door_assembly_bronze/seethru, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \ - new/datum/stack_recipe("bronze floor tile", /obj/item/stack/tile/bronze, 1, 4, 20, check_density = FALSE, category = CAT_TILES), \ - new/datum/stack_recipe("bronze hat", /obj/item/clothing/head/costume/bronze, check_density = FALSE, category = CAT_CLOTHING), \ - new/datum/stack_recipe("bronze suit", /obj/item/clothing/suit/costume/bronze, check_density = FALSE, category = CAT_CLOTHING), \ - new/datum/stack_recipe("bronze boots", /obj/item/clothing/shoes/bronze, check_density = FALSE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("directional bronze window", /obj/structure/window/bronze/unanchored, time = 0, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND | CRAFT_CHECK_DIRECTION, category = CAT_WINDOWS), \ + new/datum/stack_recipe("fulltile bronze window", /obj/structure/window/bronze/fulltile/unanchored, 2, time = 0, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND | CRAFT_IS_FULLTILE, category = CAT_WINDOWS), \ + new/datum/stack_recipe("pinion airlock assembly", /obj/structure/door_assembly/door_assembly_bronze, 4, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), \ + new/datum/stack_recipe("bronze pinion airlock assembly", /obj/structure/door_assembly/door_assembly_bronze/seethru, 4, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), \ + new/datum/stack_recipe("bronze floor tile", /obj/item/stack/tile/bronze, 1, 4, 20, crafting_flags = NONE, category = CAT_TILES), \ + new/datum/stack_recipe("bronze hat", /obj/item/clothing/head/costume/bronze, crafting_flags = NONE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("bronze suit", /obj/item/clothing/suit/costume/bronze, crafting_flags = NONE, category = CAT_CLOTHING), \ + new/datum/stack_recipe("bronze boots", /obj/item/clothing/shoes/bronze, crafting_flags = NONE, category = CAT_CLOTHING), \ null, - new/datum/stack_recipe("bronze chair", /obj/structure/chair/bronze, 1, time = 0, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ + new/datum/stack_recipe("bronze chair", /obj/structure/chair/bronze, 1, time = 0, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ )) /obj/item/stack/sheet/bronze @@ -782,30 +784,34 @@ GLOBAL_LIST_INIT(bronze_recipes, list ( \ // As bone and sinew have just a little too many recipes for this, we'll just split them up. // 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/ash_recipe/bone_greaves, - ) + var/static/list/slapcraft_recipe_list = list( + /datum/crafting_recipe/bonearmor, + /datum/crafting_recipe/boneaxe, + /datum/crafting_recipe/bonedagger, + /datum/crafting_recipe/bonespear, + /datum/crafting_recipe/bracers, + /datum/crafting_recipe/skullhelm, + /datum/crafting_recipe/ash_recipe/bone_greaves, /* SKYRAT EDIT ADDITION */ + ) AddComponent( /datum/component/slapcrafting,\ slapcraft_recipes = slapcraft_recipe_list,\ ) GLOBAL_LIST_INIT(plastic_recipes, list( - new /datum/stack_recipe("plastic floor tile", /obj/item/stack/tile/plastic, 1, 4, 20, time = 2 SECONDS, check_density = FALSE, category = CAT_TILES), \ - new /datum/stack_recipe("light tram tile", /obj/item/stack/thermoplastic/light, 1, 4, 20, time = 2 SECONDS, check_density = FALSE, category = CAT_TILES), \ - new /datum/stack_recipe("dark tram tile", /obj/item/stack/thermoplastic, 1, 4, 20, time = 2 SECONDS, check_density = FALSE, category = CAT_TILES), \ - new /datum/stack_recipe("folding plastic chair", /obj/structure/chair/plastic, 2, check_density = FALSE, category = CAT_FURNITURE), \ - new /datum/stack_recipe("plastic flaps", /obj/structure/plasticflaps, 5, one_per_turf = TRUE, on_solid_ground = TRUE, time = 4 SECONDS, category = CAT_FURNITURE), \ - new /datum/stack_recipe("water bottle", /obj/item/reagent_containers/cup/glass/waterbottle/empty, check_density = FALSE, category = CAT_CONTAINERS), \ - new /datum/stack_recipe("large water bottle", /obj/item/reagent_containers/cup/glass/waterbottle/large/empty, 3, check_density = FALSE, category = CAT_CONTAINERS), \ - new /datum/stack_recipe("colo cups", /obj/item/reagent_containers/cup/glass/colocup, 1, check_density = FALSE, category = CAT_CONTAINERS), \ - new /datum/stack_recipe("mannequin", /obj/structure/mannequin/plastic, 25, time = 5 SECONDS, one_per_turf = TRUE, check_density = FALSE, category = CAT_ENTERTAINMENT), \ - new /datum/stack_recipe("wet floor sign", /obj/item/clothing/suit/caution, 2, check_density = FALSE, category = CAT_EQUIPMENT), \ - new /datum/stack_recipe("warning cone", /obj/item/clothing/head/cone, 2, check_density = FALSE, category = CAT_EQUIPMENT), \ - new /datum/stack_recipe("blank wall sign", /obj/item/sign, 1, check_density = FALSE, category = CAT_FURNITURE), \ - new /datum/stack_recipe("rebellion mask", /obj/item/clothing/mask/rebellion, 1, check_density = FALSE, category = CAT_CLOTHING))) + new /datum/stack_recipe("plastic floor tile", /obj/item/stack/tile/plastic, 1, 4, 20, time = 2 SECONDS, crafting_flags = NONE, category = CAT_TILES), \ + new /datum/stack_recipe("light tram tile", /obj/item/stack/thermoplastic/light, 1, 4, 20, time = 2 SECONDS, crafting_flags = NONE, category = CAT_TILES), \ + new /datum/stack_recipe("dark tram tile", /obj/item/stack/thermoplastic, 1, 4, 20, time = 2 SECONDS, crafting_flags = NONE, category = CAT_TILES), \ + new /datum/stack_recipe("folding plastic chair", /obj/structure/chair/plastic, 2, crafting_flags = NONE, category = CAT_FURNITURE), \ + new /datum/stack_recipe("plastic flaps", /obj/structure/plasticflaps, 5, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, time = 4 SECONDS, category = CAT_FURNITURE), \ + new /datum/stack_recipe("water bottle", /obj/item/reagent_containers/cup/glass/waterbottle/empty, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new /datum/stack_recipe("large water bottle", /obj/item/reagent_containers/cup/glass/waterbottle/large/empty, 3, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new /datum/stack_recipe("colo cups", /obj/item/reagent_containers/cup/glass/colocup, 1, crafting_flags = NONE, category = CAT_CONTAINERS), \ + new /datum/stack_recipe("mannequin", /obj/structure/mannequin/plastic, 25, time = 5 SECONDS, crafting_flags = CRAFT_ONE_PER_TURF, category = CAT_ENTERTAINMENT), \ + new /datum/stack_recipe("wet floor sign", /obj/item/clothing/suit/caution, 2, crafting_flags = NONE, category = CAT_EQUIPMENT), \ + new /datum/stack_recipe("warning cone", /obj/item/clothing/head/cone, 2, crafting_flags = NONE, category = CAT_EQUIPMENT), \ + new /datum/stack_recipe("blank wall sign", /obj/item/sign, 1, crafting_flags = NONE, category = CAT_FURNITURE), \ + new /datum/stack_recipe("rebellion mask", /obj/item/clothing/mask/rebellion, 1, crafting_flags = NONE, category = CAT_CLOTHING))) /obj/item/stack/sheet/plastic name = "plastic" @@ -829,8 +835,8 @@ GLOBAL_LIST_INIT(plastic_recipes, list( . += GLOB.plastic_recipes GLOBAL_LIST_INIT(paperframe_recipes, list( -new /datum/stack_recipe("paper frame separator", /obj/structure/window/paperframe, 2, one_per_turf = TRUE, on_solid_ground = TRUE, is_fulltile = TRUE, time = 1 SECONDS), \ -new /datum/stack_recipe("paper frame door", /obj/structure/mineral_door/paperframe, 3, one_per_turf = TRUE, on_solid_ground = TRUE, time = 1 SECONDS ))) +new /datum/stack_recipe("paper frame separator", /obj/structure/window/paperframe, 2, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND | CRAFT_IS_FULLTILE, time = 1 SECONDS), \ +new /datum/stack_recipe("paper frame door", /obj/structure/mineral_door/paperframe, 3, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, time = 1 SECONDS ))) /obj/item/stack/sheet/paperframes name = "paper frames" diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 18a95cd77d3..4258465f3a0 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -1,9 +1,3 @@ -//stack recipe placement check types -/// Checks if there is an object of the result type in any of the cardinal directions -#define STACK_CHECK_CARDINALS (1<<0) -/// Checks if there is an object of the result type within one tile -#define STACK_CHECK_ADJACENT (1<<1) - /* Stack type objects! * Contains: * Stacks @@ -423,7 +417,7 @@ return var/turf/created_turf = covered_turf.place_on_top(recipe.result_type, flags = CHANGETURF_INHERIT_AIR) builder.balloon_alert(builder, "placed [ispath(recipe.result_type, /turf/open) ? "floor" : "wall"]") - if(recipe.applies_mats && LAZYLEN(mats_per_unit)) + if((recipe.crafting_flags & CRAFT_APPLIES_MATS) && LAZYLEN(mats_per_unit)) created_turf.set_custom_materials(mats_per_unit, recipe.req_amount / recipe.res_amount) else @@ -439,7 +433,7 @@ builder.investigate_log("crafted [recipe.title]", INVESTIGATE_CRAFTING) // Apply mat datums - if(recipe.applies_mats && LAZYLEN(mats_per_unit)) + if((recipe.crafting_flags & CRAFT_APPLIES_MATS) && LAZYLEN(mats_per_unit)) if(isstack(created)) var/obj/item/stack/crafted_stack = created crafted_stack.set_mats_per_unit(mats_per_unit, recipe.req_amount / recipe.res_amount) @@ -484,16 +478,16 @@ return FALSE var/turf/dest_turf = get_turf(builder) - if(recipe.one_per_turf && (locate(recipe.result_type) in dest_turf)) + if((recipe.crafting_flags & CRAFT_ONE_PER_TURF) && (locate(recipe.result_type) in dest_turf)) builder.balloon_alert(builder, "already one here!") return FALSE - if(recipe.check_direction) - if(!valid_build_direction(dest_turf, builder.dir, is_fulltile = recipe.is_fulltile)) + if(recipe.crafting_flags & CRAFT_CHECK_DIRECTION) + if(!valid_build_direction(dest_turf, builder.dir, is_fulltile = (recipe.crafting_flags & CRAFT_IS_FULLTILE))) builder.balloon_alert(builder, "won't fit here!") return FALSE - if(recipe.on_solid_ground) + if(recipe.crafting_flags & CRAFT_ON_SOLID_GROUND) if(isclosedturf(dest_turf)) builder.balloon_alert(builder, "cannot be made on a wall!") return FALSE @@ -503,7 +497,7 @@ builder.balloon_alert(builder, "must be made on solid ground!") return FALSE - if(recipe.check_density) + if(recipe.crafting_flags & CRAFT_CHECK_DENSITY) for(var/obj/object in dest_turf) if(object.density && !(object.obj_flags & IGNORE_DENSITY) || object.obj_flags & BLOCKS_CONSTRUCTION) builder.balloon_alert(builder, "something is in the way!") @@ -742,6 +736,3 @@ add_hiddenprint_list(GET_ATOM_HIDDENPRINTS(from)) fingerprintslast = from.fingerprintslast //TODO bloody overlay - -#undef STACK_CHECK_CARDINALS -#undef STACK_CHECK_ADJACENT diff --git a/code/game/objects/items/stacks/stack_recipe.dm b/code/game/objects/items/stacks/stack_recipe.dm index bfdc3c8ca57..a11feee8c68 100644 --- a/code/game/objects/items/stacks/stack_recipe.dm +++ b/code/game/objects/items/stacks/stack_recipe.dm @@ -15,21 +15,8 @@ var/max_res_amount = 1 /// How long it takes to make var/time = 0 - /// If only one of the resulting atom is allowed per turf - var/one_per_turf = FALSE - /// If the atom is fulltile, as in a fulltile window. This is used for the direction check to prevent fulltile windows from being able to be built over directional stuff. - /// Setting this to true will effectively set check_direction to true. - var/is_fulltile = FALSE - /// If this atom should run the direction check, for use when building things like directional windows where you can have more than one per turf - var/check_direction = FALSE - /// If the atom requires a floor below - var/on_solid_ground = FALSE - /// If the atom checks that there are objects with density in the same turf when being built. TRUE by default - var/check_density = TRUE /// Bitflag of additional placement checks required to place. (STACK_CHECK_CARDINALS|STACK_CHECK_ADJACENT|STACK_CHECK_TRAM_FORBIDDEN|STACK_CHECK_TRAM_EXCLUSIVE) var/placement_checks = NONE - /// If TRUE, the created atom will gain custom mat datums - var/applies_mats = FALSE /// What trait, if any, boosts the construction speed of this item var/trait_booster /// How much the trait above, if supplied, boosts the construct speed of this item @@ -37,6 +24,9 @@ /// Category for general crafting menu var/category + ///crafting_flags var to hold bool values + var/crafting_flags = CRAFT_CHECK_DENSITY + /datum/stack_recipe/New( title, result_type, @@ -44,13 +34,8 @@ res_amount = 1, max_res_amount = 1, time = 0, - one_per_turf = FALSE, - on_solid_ground = FALSE, - is_fulltile = FALSE, - check_direction = FALSE, - check_density = TRUE, + crafting_flags = CRAFT_CHECK_DENSITY, placement_checks = NONE, - applies_mats = FALSE, trait_booster, trait_modifier = 1, category, @@ -62,13 +47,8 @@ src.res_amount = res_amount src.max_res_amount = max_res_amount src.time = time - src.one_per_turf = one_per_turf - src.on_solid_ground = on_solid_ground - src.is_fulltile = is_fulltile - src.check_direction = check_direction || is_fulltile - src.check_density = check_density + src.crafting_flags = crafting_flags src.placement_checks = placement_checks - src.applies_mats = applies_mats src.trait_booster = trait_booster src.trait_modifier = trait_modifier src.category = src.category || category || CAT_MISC @@ -84,16 +64,13 @@ res_amount = 1, max_res_amount = 1, time = 0, - one_per_turf = FALSE, - on_solid_ground = FALSE, - window_checks = FALSE, + crafting_flags = CRAFT_CHECK_DENSITY, placement_checks = NONE, - applies_mats = FALSE, trait_booster, trait_modifier = 1, + category, desc, required_noun, - category, ) if(category) src.category = category diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index a2c553fbea1..210ade13835 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -292,6 +292,7 @@ /obj/item/weaponcell/medical, //SKYRAT EDIT MEDIGUNS /obj/item/handheld_soulcatcher, // SKYRAT EDIT SOULCATCHERS /obj/item/wrench/medical, + /obj/item/knife/ritual, )) /obj/item/storage/belt/medical/paramedic @@ -758,6 +759,7 @@ /obj/item/ammo_casing/strilka310, /obj/item/ammo_casing/shotgun, /obj/item/ammo_casing/a357, + /obj/item/ammo_casing/junk, )) /obj/item/storage/belt/fannypack diff --git a/code/game/objects/items_reskin.dm b/code/game/objects/items_reskin.dm index 1a7c27e098d..9fa3b91d0e1 100644 --- a/code/game/objects/items_reskin.dm +++ b/code/game/objects/items_reskin.dm @@ -11,12 +11,41 @@ INVOKE_ASYNC(src, PROC_REF(reskin_obj), user) return CLICK_ACTION_SUCCESS +/** + * Checks if we should set up reskinning, + * by default if unique_reskin is set. + * + * Called on setup_reskinning(). + * Inheritors should override this to add their own checks. + */ +/obj/item/proc/check_setup_reskinning() + SHOULD_CALL_PARENT(TRUE) + if(unique_reskin) + return TRUE + + return FALSE + +/** + * Registers signals and context for reskinning, + * if check_setup_reskinning() passes. + * + * Called on Initialize(...). + * Inheritors should override this to add their own setup steps, + * or to avoid double calling register_context(). + */ +/obj/item/proc/setup_reskinning() + SHOULD_CALL_PARENT(FALSE) + if(!check_setup_reskinning()) + return + + RegisterSignal(src, COMSIG_CLICK_ALT, PROC_REF(on_click_alt_reskin)) + register_context() /** * Reskins object based on a user's choice * * Arguments: - * * M The mob choosing a reskin option + * * user The mob choosing a reskin option */ /obj/item/proc/reskin_obj(mob/user) if(!LAZYLEN(unique_reskin)) diff --git a/code/game/objects/structures/deployable_turret.dm b/code/game/objects/structures/deployable_turret.dm index ac4b35678c9..7b03348288a 100644 --- a/code/game/objects/structures/deployable_turret.dm +++ b/code/game/objects/structures/deployable_turret.dm @@ -51,19 +51,21 @@ /// Undeploying, for when you want to move your big dakka around /obj/machinery/deployable_turret/wrench_act(mob/living/user, obj/item/wrench/used_wrench) - . = ..() if(!can_be_undeployed) - return + return ITEM_INTERACT_SKIP_TO_ATTACK if(!ishuman(user)) - return + return ITEM_INTERACT_SKIP_TO_ATTACK used_wrench.play_tool_sound(user) user.balloon_alert(user, "undeploying...") if(!do_after(user, undeploy_time)) - return - var/obj/undeployed_object = new spawned_on_undeploy(src) + return ITEM_INTERACT_BLOCKING + var/obj/undeployed_object = new spawned_on_undeploy() //Keeps the health the same even if you redeploy the gun undeployed_object.modify_max_integrity(max_integrity) + if(!user.put_in_hands(undeployed_object)) + undeployed_object.forceMove(loc) qdel(src) + return ITEM_INTERACT_SUCCESS //BUCKLE HOOKS diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index cc6222f4ac0..691c2ce0602 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -45,6 +45,8 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an var/locked = FALSE ///Cooldown between breakout msesages. COOLDOWN_DECLARE(breakout_message_cooldown) + /// Cooldown between being able to slide the tray in or out. + COOLDOWN_DECLARE(open_close_cd) /obj/structure/bodycontainer/Initialize(mapload) . = ..() @@ -131,30 +133,90 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an user.overlay_fullscreen("remote_view", /atom/movable/screen/fullscreen/impaired, 2) /obj/structure/bodycontainer/proc/open() - playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE) + if(!COOLDOWN_FINISHED(src, open_close_cd)) + return FALSE + + COOLDOWN_START(src, open_close_cd, 0.25 SECONDS) + playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE) playsound(src, 'sound/effects/roll.ogg', 5, TRUE) - var/turf/T = get_step(src, dir) - if (connected) - connected.setDir(dir) - for(var/atom/movable/AM in src) - AM.forceMove(T) + var/turf/dump_turf = get_step(src, dir) + connected?.setDir(dir) + for(var/atom/movable/moving in src) + moving.forceMove(dump_turf) + animate_slide_out(moving) update_appearance() + return TRUE /obj/structure/bodycontainer/proc/close() + if(!COOLDOWN_FINISHED(src, open_close_cd)) + return FALSE + + COOLDOWN_START(src, open_close_cd, 0.5 SECONDS) playsound(src, 'sound/effects/roll.ogg', 5, TRUE) playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE) - for(var/atom/movable/AM in connected.loc) - if(!AM.anchored || AM == connected) - if(isliving(AM)) - var/mob/living/living_mob = AM - if(living_mob.incorporeal_move) - continue - else if(istype(AM, /obj/effect/dummy/phased_mob)) + var/turf/close_loc = connected.loc + for(var/atom/movable/entering in close_loc) + if(entering.anchored && entering != connected) + continue + if(isliving(entering)) + var/mob/living/living_mob = entering + if(living_mob.incorporeal_move) continue - else if(isdead(AM)) - continue - AM.forceMove(src) + else if(istype(entering, /obj/effect/dummy/phased_mob) || isdead(entering)) + continue + animate_slide_in(entering, close_loc) + entering.forceMove(src) update_appearance() + return TRUE + +#define SLIDE_LENGTH (0.3 SECONDS) + +/// Slides the passed object out of the morgue tray. +/obj/structure/bodycontainer/proc/animate_slide_out(atom/movable/animated) + var/old_layer = animated.layer + animated.layer = layer - (animated == connected ? 0.03 : 0.01) + animated.pixel_x = animated.base_pixel_x + (x * 32) - (animated.x * 32) + animated.pixel_y = animated.base_pixel_y + (y * 32) - (animated.y * 32) + animate( + animated, + pixel_x = animated.base_pixel_x, + pixel_y = animated.base_pixel_y, + time = SLIDE_LENGTH, + easing = CUBIC_EASING|EASE_OUT, + flags = ANIMATION_PARALLEL, + ) + addtimer(VARSET_CALLBACK(animated, layer, old_layer), SLIDE_LENGTH) + +/// Slides the passed object into the morgue tray from the passed turf. +/obj/structure/bodycontainer/proc/animate_slide_in(atom/movable/animated, turf/from_loc) + // It's easier to just make a visual for entering than to animate the object itself + var/obj/effect/temp_visual/morgue_content/visual = new(from_loc, animated) + visual.layer = layer - (animated == connected ? 0.03 : 0.01) + animate( + visual, + pixel_x = visual.base_pixel_x + (x * 32) - (visual.x * 32), + pixel_y = visual.base_pixel_y + (y * 32) - (visual.y * 32), + time = SLIDE_LENGTH, + easing = CUBIC_EASING|EASE_IN, + flags = ANIMATION_PARALLEL, + ) + +/// Used to mimic the appearance of an object sliding into a morgue tray. +/obj/effect/temp_visual/morgue_content + duration = SLIDE_LENGTH + +/obj/effect/temp_visual/morgue_content/Initialize(mapload, atom/movable/sliding_in) + . = ..() + if(isnull(sliding_in)) + return + + appearance = sliding_in.appearance + dir = sliding_in.dir + alpha = sliding_in.alpha + base_pixel_x = sliding_in.base_pixel_x + base_pixel_y = sliding_in.base_pixel_y + +#undef SLIDE_LENGTH #define MORGUE_EMPTY 1 #define MORGUE_NO_MOBS 2 @@ -531,6 +593,7 @@ GLOBAL_LIST_EMPTY(crematoriums) name = "crematorium tray" desc = "Apply body before burning." icon_state = "cremat" + layer = /obj/structure/bodycontainer/crematorium::layer - 0.03 /* * Morgue tray @@ -541,6 +604,7 @@ GLOBAL_LIST_EMPTY(crematoriums) icon = 'icons/obj/structures.dmi' icon_state = "morguet" pass_flags_self = PASSTABLE | LETPASSTHROW + layer = /obj/structure/bodycontainer/morgue::layer - 0.03 /obj/structure/tray/m_tray/CanAllowThrough(atom/movable/mover, border_dir) . = ..() diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm index 3a81ae8a6e4..e22dc8b3865 100644 --- a/code/game/turfs/open/_open.dm +++ b/code/game/turfs/open/_open.dm @@ -41,15 +41,33 @@ /turf/open/update_overlays() if(isnull(damaged_dmi)) return ..() + . = ..() + if(broken) - . += mutable_appearance(damaged_dmi, pick(broken_states())) + var/mutable_appearance/broken_appearance = mutable_appearance(damaged_dmi, pick(broken_states())) + + if(smoothing_flags && !(smoothing_flags & SMOOTH_BROKEN_TURF)) + var/matrix/translation = new + translation.Translate(-LARGE_TURF_SMOOTHING_X_OFFSET, -LARGE_TURF_SMOOTHING_Y_OFFSET) + broken_appearance.transform = translation + + . += broken_appearance + else if(burnt) var/list/burnt_states = burnt_states() + var/mutable_appearance/burnt_appearance if(burnt_states.len) - . += mutable_appearance(damaged_dmi, pick(burnt_states)) + burnt_appearance = mutable_appearance(damaged_dmi, pick(burnt_states)) else - . += mutable_appearance(damaged_dmi, pick(broken_states())) + burnt_appearance = mutable_appearance(damaged_dmi, pick(broken_states())) + + if(smoothing_flags && !(smoothing_flags & SMOOTH_BURNT_TURF)) + var/matrix/translation = new + translation.Translate(-LARGE_TURF_SMOOTHING_X_OFFSET, -LARGE_TURF_SMOOTHING_Y_OFFSET) + burnt_appearance.transform = translation + + . += burnt_appearance //direction is direction of travel of A /turf/open/zPassIn(direction) diff --git a/code/game/turfs/open/grass.dm b/code/game/turfs/open/grass.dm index d4bfc051e3b..676ba11da1f 100644 --- a/code/game/turfs/open/grass.dm +++ b/code/game/turfs/open/grass.dm @@ -10,29 +10,52 @@ barefootstep = FOOTSTEP_GRASS clawfootstep = FOOTSTEP_GRASS heavyfootstep = FOOTSTEP_GENERIC_HEAVY - smoothing_flags = SMOOTH_BITMASK + smoothing_flags = SMOOTH_BITMASK | SMOOTH_BROKEN_TURF | SMOOTH_BURNT_TURF smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_FLOOR_GRASS canSmoothWith = SMOOTH_GROUP_FLOOR_GRASS + SMOOTH_GROUP_CLOSED_TURFS layer = HIGH_TURF_LAYER - damaged_dmi = 'icons/turf/damaged.dmi' + damaged_dmi = 'icons/turf/floors/grass_damaged.dmi' + /// The icon used for smoothing. var/smooth_icon = 'icons/turf/floors/grass.dmi' + /// The base icon_state for the broken state. + var/base_broken_icon_state = "grass_damaged" + /// The base icon_state for the burnt state. + var/base_burnt_icon_state = "grass_damaged" /turf/open/misc/grass/broken_states() - return list("grass_damaged") + if (!smoothing_junction || !(smoothing_flags & SMOOTH_BROKEN_TURF)) + return list("[base_broken_icon_state]-255") + + return list("[base_broken_icon_state]-[smoothing_junction]") /turf/open/misc/grass/burnt_states() - return list("grass_damaged") + if (!smoothing_junction || !(smoothing_flags & SMOOTH_BURNT_TURF)) + return list("[base_burnt_icon_state]-255") + + return list("[base_burnt_icon_state]-[smoothing_junction]") /turf/open/misc/grass/Initialize(mapload) . = ..() if(smoothing_flags) var/matrix/translation = new - translation.Translate(-9, -9) + translation.Translate(LARGE_TURF_SMOOTHING_X_OFFSET, LARGE_TURF_SMOOTHING_Y_OFFSET) transform = translation icon = smooth_icon if(is_station_level(z)) GLOB.station_turfs += src + +/turf/open/misc/grass/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) + . = ..() + if (!.) + return + + if(!smoothing_flags) + return + + underlay_appearance.transform = transform + + /turf/open/misc/grass/lavaland initial_gas_mix = LAVALAND_DEFAULT_ATMOS diff --git a/code/game/turfs/open/planet.dm b/code/game/turfs/open/planet.dm index db391025e84..03ca1281290 100644 --- a/code/game/turfs/open/planet.dm +++ b/code/game/turfs/open/planet.dm @@ -66,20 +66,14 @@ /turf/open/misc/grass/jungle name = "jungle grass" + desc = "Greener on the other side." initial_gas_mix = OPENTURF_DEFAULT_ATMOS planetary_atmos = TRUE baseturfs = /turf/open/misc/dirt - desc = "Greener on the other side." icon_state = "junglegrass" base_icon_state = "junglegrass" smooth_icon = 'icons/turf/floors/junglegrass.dmi' -/turf/open/misc/grass/broken_states() - return list("jungle_damaged") - -/turf/open/misc/grass/burnt_states() - return list("jungle_damaged") - /turf/open/misc/grass/jungle/lavaland initial_gas_mix = LAVALAND_DEFAULT_ATMOS diff --git a/code/game/turfs/open/water.dm b/code/game/turfs/open/water.dm index 55ca23beead..7881c63d567 100644 --- a/code/game/turfs/open/water.dm +++ b/code/game/turfs/open/water.dm @@ -20,10 +20,15 @@ */ var/immerse_overlay_color = "#5AAA88" + /// Fishing element for this specific water tile + var/datum/fish_source/fishing_datum = /datum/fish_source/portal + /turf/open/water/Initialize(mapload) . = ..() AddElement(/datum/element/immerse, icon, icon_state, "immerse", immerse_overlay_color) AddElement(/datum/element/watery_tile) + if(!isnull(fishing_datum)) + AddElement(/datum/element/lazy_fishing_spot, fishing_datum) /turf/open/water/jungle @@ -35,7 +40,4 @@ base_icon_state = "water" baseturfs = /turf/open/water/beach immerse_overlay_color = "#7799AA" - -/turf/open/water/beach/Initialize(mapload) - . = ..() - AddElement(/datum/element/lazy_fishing_spot, /datum/fish_source/ocean/beach) + fishing_datum = /datum/fish_source/ocean/beach diff --git a/code/modules/admin/ipintel.dm b/code/modules/admin/ipintel.dm deleted file mode 100644 index 7ca4ccbc320..00000000000 --- a/code/modules/admin/ipintel.dm +++ /dev/null @@ -1,136 +0,0 @@ -/datum/ipintel - var/ip - var/intel = 0 - var/cache = FALSE - var/cacheminutesago = 0 - var/cachedate = "" - var/cacherealtime = 0 - -/datum/ipintel/New() - cachedate = SQLtime() - cacherealtime = world.realtime - -/datum/ipintel/proc/is_valid() - . = FALSE - if (intel < 0) - return - if (intel <= CONFIG_GET(number/ipintel_rating_bad)) - if (world.realtime < cacherealtime + (CONFIG_GET(number/ipintel_save_good) * 60 * 60 * 10)) - return TRUE - else - if (world.realtime < cacherealtime + (CONFIG_GET(number/ipintel_save_bad) * 60 * 60 * 10)) - return TRUE - -/proc/get_ip_intel(ip, bypasscache = FALSE, updatecache = TRUE) - var/datum/ipintel/res = new() - res.ip = ip - . = res - if (!ip || !CONFIG_GET(string/ipintel_email) || !SSipintel.enabled) - return - if (!bypasscache) - var/datum/ipintel/cachedintel = SSipintel.cache[ip] - if (cachedintel?.is_valid()) - cachedintel.cache = TRUE - return cachedintel - - if(SSdbcore.Connect()) - var/rating_bad = CONFIG_GET(number/ipintel_rating_bad) - var/datum/db_query/query_get_ip_intel = SSdbcore.NewQuery({" - SELECT date, intel, TIMESTAMPDIFF(MINUTE,date,NOW()) - FROM [format_table_name("ipintel")] - WHERE - ip = INET_ATON(':ip') - AND (( - intel < :rating_bad - AND - date + INTERVAL :save_good HOUR > NOW() - ) OR ( - intel >= :rating_bad - AND - date + INTERVAL :save_bad HOUR > NOW() - )) - "}, list("ip" = ip, "rating_bad" = rating_bad, "save_good" = CONFIG_GET(number/ipintel_save_good), "save_bad" = CONFIG_GET(number/ipintel_save_bad))) - if(!query_get_ip_intel.Execute()) - qdel(query_get_ip_intel) - return - if (query_get_ip_intel.NextRow()) - res.cache = TRUE - res.cachedate = query_get_ip_intel.item[1] - res.intel = text2num(query_get_ip_intel.item[2]) - res.cacheminutesago = text2num(query_get_ip_intel.item[3]) - res.cacherealtime = world.realtime - (text2num(query_get_ip_intel.item[3])*10*60) - SSipintel.cache[ip] = res - qdel(query_get_ip_intel) - return - qdel(query_get_ip_intel) - res.intel = ip_intel_query(ip) - if (updatecache && res.intel >= 0) - SSipintel.cache[ip] = res - if(SSdbcore.Connect()) - var/datum/db_query/query_add_ip_intel = SSdbcore.NewQuery( - "INSERT INTO [format_table_name("ipintel")] (ip, intel) VALUES (INET_ATON(:ip), :intel) ON DUPLICATE KEY UPDATE intel = VALUES(intel), date = NOW()", - list("ip" = ip, "intel" = res.intel) - ) - query_add_ip_intel.Execute() - qdel(query_add_ip_intel) - - -/proc/ip_intel_query(ip, retryed=0) - . = -1 //default - if (!ip) - return - if (SSipintel.throttle > world.timeofday) - return - if (!SSipintel.enabled) - return - - var/list/http[] = world.Export("http://[CONFIG_GET(string/ipintel_domain)]/check.php?ip=[ip]&contact=[CONFIG_GET(string/ipintel_email)]&format=json&flags=f") - - if (http) - var/status = text2num(http["STATUS"]) - - if (status == 200) - var/response = json_decode(file2text(http["CONTENT"])) - if (response) - if (response["status"] == "success") - var/intelnum = text2num(response["result"]) - if (isnum(intelnum)) - return text2num(response["result"]) - else - ipintel_handle_error("Bad intel from server: [response["result"]].", ip, retryed) - if (!retryed) - sleep(2.5 SECONDS) - return .(ip, 1) - else - ipintel_handle_error("Bad response from server: [response["status"]].", ip, retryed) - if (!retryed) - sleep(2.5 SECONDS) - return .(ip, 1) - - else if (status == 429) - ipintel_handle_error("Error #429: We have exceeded the rate limit.", ip, 1) - return - else - ipintel_handle_error("Unknown status code: [status].", ip, retryed) - if (!retryed) - sleep(2.5 SECONDS) - return .(ip, 1) - else - ipintel_handle_error("Unable to connect to API.", ip, retryed) - if (!retryed) - sleep(2.5 SECONDS) - return .(ip, 1) - - -/proc/ipintel_handle_error(error, ip, retryed) - if (retryed) - SSipintel.errors++ - error += " Could not check [ip]. Disabling IPINTEL for [SSipintel.errors] minute[( SSipintel.errors == 1 ? "" : "s" )]" - SSipintel.throttle = world.timeofday + (10 * 120 * SSipintel.errors) - else - error += " Attempting retry on [ip]." - log_ipintel(error) - -/proc/log_ipintel(text) - log_game("IPINTEL: [text]") - debug_admins("IPINTEL: [text]") diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index e56eb1e5101..20cdf351459 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -765,7 +765,7 @@ ADMIN_VERB(reestablish_tts_connection, R_DEBUG, "Re-establish Connection To TTS" var/list/sorted = list() for (var/source in per_source) sorted += list(list("source" = source, "count" = per_source[source])) - sorted = sortTim(sorted, GLOBAL_PROC_REF(cmp_timer_data)) + sortTim(sorted, GLOBAL_PROC_REF(cmp_timer_data)) // Now that everything is sorted, compile them into an HTML output var/output = "" diff --git a/code/modules/admin/verbs/light_debug.dm b/code/modules/admin/verbs/light_debug.dm index ae5b24ff380..eac81f6ed29 100644 --- a/code/modules/admin/verbs/light_debug.dm +++ b/code/modules/admin/verbs/light_debug.dm @@ -10,7 +10,7 @@ sum[source.source_atom.type] += 1 total += 1 - sum = sortTim(sum, /proc/cmp_numeric_asc, TRUE) + sortTim(sum, associative = TRUE) var/text = "" for(var/type in sum) text += "[type] = [sum[type]]\n" diff --git a/code/modules/admin/verbs/secrets.dm b/code/modules/admin/verbs/secrets.dm index b7aa16b6b5f..c5f6ddb5e9a 100644 --- a/code/modules/admin/verbs/secrets.dm +++ b/code/modules/admin/verbs/secrets.dm @@ -617,7 +617,7 @@ ADMIN_VERB(secrets, R_NONE, "Secrets", "Abuse harder than you ever have before w E.announce_chance = 0 E.processing = TRUE if(holder) - log_admin("[key_name(holder)] used secret [action]") + log_admin("[key_name(holder)] used secret: [action].") #undef THUNDERDOME_TEMPLATE_FILE #undef HIGHLANDER_DELAY_TEXT diff --git a/code/modules/antagonists/brother/brother.dm b/code/modules/antagonists/brother/brother.dm index 214825f4c73..e7123c9afab 100644 --- a/code/modules/antagonists/brother/brother.dm +++ b/code/modules/antagonists/brother/brother.dm @@ -168,13 +168,15 @@ member_name = "blood brother" var/brothers_left = 2 -/datum/team/brother_team/New() +/datum/team/brother_team/New(starting_members) . = ..() if (prob(10)) brothers_left += 1 /datum/team/brother_team/add_member(datum/mind/new_member) . = ..() + if (!length(objectives)) + forge_brother_objectives() if (!new_member.has_antag_datum(/datum/antagonist/brother)) add_brother(new_member.current) @@ -218,7 +220,7 @@ add_objective(new /datum/objective/convert_brother) var/is_hijacker = prob(10) - for(var/i = 1 to max(1, CONFIG_GET(number/brother_objectives_amount) + (members.len > 2) - is_hijacker)) + for(var/i = 1 to max(1, CONFIG_GET(number/brother_objectives_amount) + (brothers_left > 2) - is_hijacker)) forge_single_objective() if(is_hijacker) if(!locate(/datum/objective/hijack) in objectives) diff --git a/code/modules/antagonists/heretic/items/corrupted_organs.dm b/code/modules/antagonists/heretic/items/corrupted_organs.dm new file mode 100644 index 00000000000..311e84c8055 --- /dev/null +++ b/code/modules/antagonists/heretic/items/corrupted_organs.dm @@ -0,0 +1,242 @@ +/// Renders you unable to see people who were heretics at the time that this organ is gained +/obj/item/organ/internal/eyes/corrupt + name = "corrupt orbs" + desc = "These eyes have seen something they shouldn't have." + /// The override images we are applying + var/list/hallucinations + +/obj/item/organ/internal/eyes/corrupt/Initialize(mapload) + . = ..() + AddElement(/datum/element/corrupted_organ) + AddElement(/datum/element/noticable_organ, "%PRONOUN_Their eyes have wide dilated pupils, and no iris. Something is moving in the darkness.", BODY_ZONE_PRECISE_EYES) + +/obj/item/organ/internal/eyes/corrupt/on_mob_insert(mob/living/carbon/organ_owner, special, movement_flags) + . = ..() + if (!organ_owner.client) + return + + var/list/human_mobs = GLOB.human_list.Copy() + human_mobs -= organ_owner + for (var/mob/living/carbon/human/check_human as anything in human_mobs) + if (!IS_HERETIC(check_human) && !prob(5)) // Throw in some false positives + continue + var/image/invisible_man = image('icons/blanks/32x32.dmi', check_human, "nothing") + invisible_man.override = TRUE + LAZYADD(hallucinations, invisible_man) + + if (LAZYLEN(hallucinations)) + organ_owner.client.images |= hallucinations + +/obj/item/organ/internal/eyes/corrupt/on_mob_remove(mob/living/carbon/organ_owner, special) + . = ..() + if (!LAZYLEN(hallucinations)) + return + organ_owner.client?.images -= hallucinations + QDEL_NULL(hallucinations) + + +/// Sometimes speak in incomprehensible tongues +/obj/item/organ/internal/tongue/corrupt + name = "corrupt tongue" + desc = "This one tells only lies." + +/obj/item/organ/internal/tongue/corrupt/Initialize(mapload) + . = ..() + AddElement(/datum/element/corrupted_organ) + AddElement(/datum/element/noticable_organ, "The inside of %PRONOUN_Their mouth is full of stars.", BODY_ZONE_PRECISE_MOUTH) + +/obj/item/organ/internal/tongue/corrupt/on_mob_insert(mob/living/carbon/organ_owner, special, movement_flags) + . = ..() + RegisterSignal(organ_owner, COMSIG_MOB_SAY, PROC_REF(on_spoken)) + +/obj/item/organ/internal/tongue/corrupt/on_mob_remove(mob/living/carbon/organ_owner, special) + . = ..() + UnregisterSignal(organ_owner, COMSIG_MOB_SAY) + +/// When the mob speaks, sometimes put it in a different language +/obj/item/organ/internal/tongue/corrupt/proc/on_spoken(mob/living/organ_owner, list/speech_args) + SIGNAL_HANDLER + if (organ_owner.has_reagent(/datum/reagent/water/holywater) || prob(60)) + return + speech_args[SPEECH_LANGUAGE] = /datum/language/shadowtongue + + +/// Randomly secretes alcohol or hallucinogens when you're drinking something +/obj/item/organ/internal/liver/corrupt + name = "corrupt liver" + desc = "After what you've seen you could really go for a drink." + /// How much extra ingredients to add? + var/amount_added = 5 + /// What extra ingredients can we add? + var/list/extra_ingredients = list( + /datum/reagent/consumable/ethanol/pina_olivada, + /datum/reagent/consumable/ethanol/rum, + /datum/reagent/consumable/ethanol/thirteenloko, + /datum/reagent/consumable/ethanol/vodka, + /datum/reagent/consumable/superlaughter, + /datum/reagent/drug/bath_salts, + /datum/reagent/drug/blastoff, + /datum/reagent/drug/happiness, + /datum/reagent/drug/mushroomhallucinogen, + ) + +/obj/item/organ/internal/liver/corrupt/Initialize(mapload) + . = ..() + AddElement(/datum/element/corrupted_organ) + +/obj/item/organ/internal/liver/corrupt/on_mob_insert(mob/living/carbon/organ_owner, special) + . = ..() + RegisterSignal(organ_owner, COMSIG_ATOM_EXPOSE_REAGENTS, PROC_REF(on_drank)) + +/obj/item/organ/internal/liver/corrupt/on_mob_remove(mob/living/carbon/organ_owner, special) + . = ..() + UnregisterSignal(organ_owner, COMSIG_ATOM_EXPOSE_REAGENTS) + +/// If we drank something, add a little extra +/obj/item/organ/internal/liver/corrupt/proc/on_drank(atom/source, list/reagents, datum/reagents/source_reagents, methods) + SIGNAL_HANDLER + if (!(methods & INGEST)) + return + var/datum/reagents/extra_reagents = new() + extra_reagents.add_reagent(pick(extra_ingredients), amount_added) + extra_reagents.trans_to(source, amount_added, transferred_by = src, methods = INJECT) + if (prob(20)) + to_chat(source, span_warning("As you take a sip, you feel something bubbling in your stomach...")) + + +/// Rapidly become hungry if you are not digesting blood +/obj/item/organ/internal/stomach/corrupt + name = "corrupt stomach" + desc = "This parasite demands an unwholesome diet in order to be satisfied." + /// Do we have an unholy thirst? + var/thirst_satiated = FALSE + /// Timer for when we get thirsty again + var/thirst_timer + /// How long until we prompt the player to drink blood again? + COOLDOWN_DECLARE(message_cooldown) + +/obj/item/organ/internal/stomach/corrupt/Initialize(mapload) + . = ..() + AddElement(/datum/element/corrupted_organ) + AddElement(/datum/element/noticable_organ, "%PRONOUN_They %PRONOUN_have an unhealthy pallor.") + +/obj/item/organ/internal/stomach/corrupt/on_mob_insert(mob/living/carbon/organ_owner, special) + . = ..() + RegisterSignal(organ_owner, COMSIG_ATOM_EXPOSE_REAGENTS, PROC_REF(on_drank)) + +/obj/item/organ/internal/stomach/corrupt/on_mob_remove(mob/living/carbon/organ_owner, special) + . = ..() + UnregisterSignal(organ_owner, COMSIG_ATOM_EXPOSE_REAGENTS) + +/// Check if we drank a little blood +/obj/item/organ/internal/stomach/corrupt/proc/on_drank(atom/source, list/reagents, datum/reagents/source_reagents, methods) + SIGNAL_HANDLER + if (!(methods & INGEST)) + return + + var/contains_blood = locate(/datum/reagent/blood) in reagents + if (!contains_blood) + return + + if (!thirst_satiated) + to_chat(source, span_cult_italic("The thirst is satisfied... for now.")) + thirst_satiated = TRUE + deltimer(thirst_timer) + thirst_timer = addtimer(VARSET_CALLBACK(src, thirst_satiated, FALSE), 3 MINUTES, TIMER_STOPPABLE | TIMER_DELETE_ME) + +/obj/item/organ/internal/stomach/corrupt/handle_hunger(mob/living/carbon/human/human, seconds_per_tick, times_fired) + if (thirst_satiated || human.has_reagent(/datum/reagent/water/holywater)) + return ..() + + human.adjust_nutrition(-1 * seconds_per_tick) + + if (!COOLDOWN_FINISHED(src, message_cooldown)) + return ..() + COOLDOWN_START(src, message_cooldown, 30 SECONDS) + + var/static/list/blood_messages = list( + "Blood...", + "Everyone suddenly looks so tasty.", + "The blood...", + "There's an emptiness in you that only blood can fill.", + "You could really go for some blood right now.", + "You feel the blood rushing through your veins.", + "You think about biting someone's throat.", + "Your stomach growls and you feel a metallic taste in your mouth.", + ) + to_chat(human, span_cult_italic(pick(blood_messages))) + + return ..() + + +/// Occasionally bombards you with spooky hands and lets everyone hear your pulse. +/obj/item/organ/internal/heart/corrupt + name = "corrupt heart" + desc = "What corruption is this spreading along with the blood?" + /// How long until the next heart? + COOLDOWN_DECLARE(hand_cooldown) + +/obj/item/organ/internal/heart/corrupt/Initialize(mapload) + . = ..() + AddElement(/datum/element/corrupted_organ) + +/obj/item/organ/internal/heart/corrupt/on_life(seconds_per_tick, times_fired) + . = ..() + if (!COOLDOWN_FINISHED(src, hand_cooldown) || IS_IN_MANSUS(owner) || !owner.needs_heart() || !is_beating() || owner.has_reagent(/datum/reagent/water/holywater)) + return + fire_curse_hand(owner) + COOLDOWN_START(src, hand_cooldown, rand(6 SECONDS, 45 SECONDS)) // Wide variance to put you off guard + + +/// Sometimes cough out some kind of dangerous gas +/obj/item/organ/internal/lungs/corrupt + name = "corrupt lungs" + desc = "Some things SHOULD be drowned in tar." + /// How likely are we not to cough every time we take a breath? + var/cough_chance = 15 + /// How much gas to emit? + var/gas_amount = 30 + /// What can we cough up? + var/list/gas_types = list( + /datum/gas/bz = 30, + /datum/gas/miasma = 50, + /datum/gas/plasma = 20, + ) + +/obj/item/organ/internal/lungs/corrupt/Initialize(mapload) + . = ..() + AddElement(/datum/element/corrupted_organ) + +/obj/item/organ/internal/lungs/corrupt/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/breather) + . = ..() + if (!. || IS_IN_MANSUS(owner) || breather.has_reagent(/datum/reagent/water/holywater) || !prob(cough_chance)) + return + breather.emote("cough"); + var/chosen_gas = pick_weight(gas_types) + var/datum/gas_mixture/mix_to_spawn = new() + mix_to_spawn.add_gas(pick(chosen_gas)) + mix_to_spawn.gases[chosen_gas][MOLES] = gas_amount + mix_to_spawn.temperature = breather.bodytemperature + log_atmos("[owner] coughed some gas into the air due to their corrupted lungs.", mix_to_spawn) + var/turf/open/our_turf = get_turf(breather) + our_turf.assume_air(mix_to_spawn) + + +/// It's full of worms +/obj/item/organ/internal/appendix/corrupt + name = "corrupt appendix" + desc = "What kind of dark, cosmic force is even going to bother to corrupt an appendix?" + /// How likely are we to spawn worms? + var/worm_chance = 2 + +/obj/item/organ/internal/appendix/corrupt/Initialize(mapload) + . = ..() + AddElement(/datum/element/corrupted_organ) + AddElement(/datum/element/noticable_organ, "%PRONOUN_Their abdomen is distended... and wiggling.", BODY_ZONE_PRECISE_GROIN) + +/obj/item/organ/internal/appendix/corrupt/on_life(seconds_per_tick, times_fired) + . = ..() + if (owner.stat != CONSCIOUS || owner.has_reagent(/datum/reagent/water/holywater) || IS_IN_MANSUS(owner) || !SPT_PROB(worm_chance, seconds_per_tick)) + return + owner.vomit(MOB_VOMIT_MESSAGE | MOB_VOMIT_HARM, vomit_type = /obj/effect/decal/cleanable/vomit/nebula/worms, distance = 0) + owner.Knockdown(0.5 SECONDS) diff --git a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_buff.dm b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_buff.dm index 3749e37fe6a..30757e88a4b 100644 --- a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_buff.dm +++ b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_buff.dm @@ -107,3 +107,17 @@ return bloodiest_wound.adjust_blood_flow(-0.5 * seconds_between_ticks) + +/// Torment the target with a frightening hand +/proc/fire_curse_hand(mob/living/carbon/victim) + var/grab_dir = turn(victim.dir, pick(-90, 90, 180, 180)) // Not in front, favour behind + var/turf/spawn_turf = get_ranged_target_turf(victim, grab_dir, 8) + if (isnull(spawn_turf)) + return + new /obj/effect/temp_visual/dir_setting/curse/grasp_portal(spawn_turf, victim.dir) + playsound(spawn_turf, 'sound/effects/curse2.ogg', 80, TRUE, -1) + var/obj/projectile/curse_hand/hel/hand = new (spawn_turf) + hand.preparePixelProjectile(victim, spawn_turf) + if (QDELETED(hand)) // safety check if above fails - above has a stack trace if it does fail + return + hand.fire() diff --git a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_curse.dm b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_curse.dm new file mode 100644 index 00000000000..87086de6e00 --- /dev/null +++ b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_curse.dm @@ -0,0 +1,93 @@ +/// A curse given to people to disencourage them from retaliating against someone who sacrificed them +/datum/status_effect/heretic_curse + id = "heretic_curse" + alert_type = null + status_type = STATUS_EFFECT_MULTIPLE // In case several different people sacrifice you, unlucky + /// Who cursed us? + var/mob/living/the_curser + /// Don't experience bad things too often + COOLDOWN_DECLARE(consequence_cooldown) + +/datum/status_effect/heretic_curse/on_creation(mob/living/new_owner, mob/living/the_curser) + src.the_curser = the_curser + return ..() + +/datum/status_effect/heretic_curse/Destroy() + the_curser = null + return ..() + +/datum/status_effect/heretic_curse/on_apply() + if (isnull(the_curser) || !iscarbon(owner)) + return FALSE + + the_curser.AddElement(/datum/element/relay_attackers) + RegisterSignal(the_curser, COMSIG_ATOM_WAS_ATTACKED, PROC_REF(on_curser_attacked)) + RegisterSignal(the_curser, COMSIG_QDELETING, PROC_REF(on_curser_destroyed)) + + owner.AddElement(/datum/element/relay_attackers) + RegisterSignal(owner, COMSIG_ATOM_WAS_ATTACKED, PROC_REF(on_owner_attacked)) + + return TRUE + +/datum/status_effect/heretic_curse/on_remove() + UnregisterSignal(owner, COMSIG_ATOM_WAS_ATTACKED) + UnregisterSignal(the_curser, COMSIG_ATOM_WAS_ATTACKED) + the_curser = null + + +/// If the heretic that cursed us is destroyed this thing is useless now +/datum/status_effect/heretic_curse/proc/on_curser_destroyed() + SIGNAL_HANDLER + qdel(src) + +/// If we attack the guy who cursed us, that's no good +/datum/status_effect/heretic_curse/proc/on_curser_attacked(datum/source, mob/attacker) + SIGNAL_HANDLER + if (attacker != owner || !HAS_TRAIT(source, TRAIT_ALLOW_HERETIC_CASTING)) + return + log_combat(owner, the_curser, "attacked", addition = "and lost some organs because they had previously been sacrificed by them.") + experience_the_consequences() + +/// If we are attacked by the guy who cursed us, that's also no good +/datum/status_effect/heretic_curse/proc/on_owner_attacked(datum/source, mob/attacker) + SIGNAL_HANDLER + if (attacker != the_curser || !HAS_TRAIT(attacker, TRAIT_ALLOW_HERETIC_CASTING)) + return + log_combat(the_curser, owner, "attacked", addition = "and as they had previously sacrificed them, removed some of their organs.") + experience_the_consequences() + +/// Experience something you may not enjoy which may also significantly shorten your lifespan +/datum/status_effect/heretic_curse/proc/experience_the_consequences() + if (!COOLDOWN_FINISHED(src, consequence_cooldown) || owner.stat != CONSCIOUS) + return + + var/mob/living/carbon/carbon_owner = owner + var/obj/item/bodypart/chest/organ_storage = owner.get_bodypart(BODY_ZONE_CHEST) + if (isnull(organ_storage)) + carbon_owner.gib() // IDK how you don't have a chest but you're not getting away that easily + return + + var/list/removable_organs = list() + for(var/obj/item/organ/internal/bodypart_organ in organ_storage.contents) + if(bodypart_organ.organ_flags & ORGAN_UNREMOVABLE) + continue + removable_organs += bodypart_organ + + if (!length(removable_organs)) + return // This one is a little more possible but they're probably already in pretty bad shape by this point + + var/obj/item/organ/internal/removing_organ = pick(removable_organs) + + if (carbon_owner.vomit(vomit_flags = VOMIT_CATEGORY_BLOOD)) + carbon_owner.visible_message(span_boldwarning("[carbon_owner] vomits out [carbon_owner.p_their()] [removing_organ]")) + else + carbon_owner.visible_message(span_boldwarning("[carbon_owner]'s [removing_organ] rips itself out of `[carbon_owner.p_their()] chest!")) + + removing_organ.Remove(carbon_owner) + + var/turf/land_turf = get_step(carbon_owner, carbon_owner.dir) + if (land_turf.is_blocked_turf(exclude_mobs = TRUE)) + land_turf = carbon_owner.drop_location() + + removing_organ.forceMove(land_turf) + COOLDOWN_START(src, consequence_cooldown, 10 SECONDS) diff --git a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm index 20e677ed9ed..1d2be465b30 100644 --- a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm +++ b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm @@ -26,6 +26,16 @@ var/list/datum/mind/target_blacklist /// An assoc list of [ref] to [timers] - a list of all the timers of people in the shadow realm currently var/list/return_timers + /// Evil organs we can put in people + var/static/list/grantable_organs = list( + /obj/item/organ/internal/appendix/corrupt, + /obj/item/organ/internal/eyes/corrupt, + /obj/item/organ/internal/heart/corrupt, + /obj/item/organ/internal/liver/corrupt, + /obj/item/organ/internal/lungs/corrupt, + /obj/item/organ/internal/stomach/corrupt, + /obj/item/organ/internal/tongue/corrupt, + ) /datum/heretic_knowledge/hunt_and_sacrifice/Destroy(force) heretic_mind = null @@ -197,6 +207,8 @@ heretic_datum.total_sacrifices++ heretic_datum.knowledge_points += 2 + sacrifice.apply_status_effect(/datum/status_effect/heretic_curse, user) + if(!begin_sacrifice(sacrifice)) disembowel_target(sacrifice) @@ -278,6 +290,8 @@ disembowel_target(sac_target) return + curse_organs(sac_target) + // Send 'em to the destination. If the teleport fails, just disembowel them and stop the chain if(!destination || !do_teleport(sac_target, destination, asoundin = 'sound/magic/repulse.ogg', asoundout = 'sound/magic/blind.ogg', no_effects = TRUE, channel = TELEPORT_CHANNEL_MAGIC, forced = TRUE)) disembowel_target(sac_target) @@ -299,6 +313,31 @@ RegisterSignal(sac_target, COMSIG_MOVABLE_Z_CHANGED, PROC_REF(on_target_escape)) // Cheese condition RegisterSignal(sac_target, COMSIG_LIVING_DEATH, PROC_REF(on_target_death)) // Loss condition +/// Apply a sinister curse to some of the target's organs as an incentive to leave us alone +/datum/heretic_knowledge/hunt_and_sacrifice/proc/curse_organs(mob/living/carbon/human/sac_target) + var/usable_organs = grantable_organs.Copy() + if (isplasmaman(sac_target)) + usable_organs -= /obj/item/organ/internal/lungs/corrupt // Their lungs are already more cursed than anything I could give them + + var/total_implant = rand(2, 4) + var/gave_any = FALSE + + for (var/i in 1 to total_implant) + if (!length(usable_organs)) + break + var/organ_path = pick_n_take(usable_organs) + var/obj/item/organ/internal/to_give = new organ_path + if (!to_give.Insert(sac_target)) + qdel(to_give) + else + gave_any = TRUE + + if (!gave_any) + return + + new /obj/effect/gibspawner/human/bodypartless(get_turf(sac_target)) + sac_target.visible_message(span_boldwarning("Several organs force themselves out of [sac_target]!")) + /** * This proc is called from [proc/after_target_sleeps] when the [sac_target] should be waking up.) * @@ -375,10 +414,6 @@ if(IS_HERETIC(sac_target)) var/datum/antagonist/heretic/victim_heretic = sac_target.mind?.has_antag_datum(/datum/antagonist/heretic) victim_heretic.knowledge_points -= 3 - else - //BUBBER EDIT START - makes the phobia curable - sac_target.gain_trauma(/datum/brain_trauma/mild/phobia/heresy, TRAUMA_RESILIENCE_SURGERY /*TRAUMA_RESILIENCE_MAGIC*/) - //BUBBER EDIT END // Wherever we end up, we sure as hell won't be able to explain sac_target.adjust_timed_status_effect(40 SECONDS, /datum/status_effect/speech/slurring/heretic) diff --git a/code/modules/antagonists/malf_ai/malf_ai_module_picker.dm b/code/modules/antagonists/malf_ai/malf_ai_module_picker.dm index 51058f82ac0..0ac27c14c97 100644 --- a/code/modules/antagonists/malf_ai/malf_ai_module_picker.dm +++ b/code/modules/antagonists/malf_ai/malf_ai_module_picker.dm @@ -24,7 +24,7 @@ filtered_modules[AM.category][AM] = AM for(var/category in filtered_modules) - filtered_modules[category] = sortTim(filtered_modules[category], GLOBAL_PROC_REF(cmp_malfmodules_priority)) + sortTim(filtered_modules[category], GLOBAL_PROC_REF(cmp_malfmodules_priority)) return filtered_modules diff --git a/code/modules/antagonists/pirate/pirate.dm b/code/modules/antagonists/pirate/pirate.dm index 15a028b24d7..0fa80f55247 100644 --- a/code/modules/antagonists/pirate/pirate.dm +++ b/code/modules/antagonists/pirate/pirate.dm @@ -85,7 +85,7 @@ //Lists notable loot. if(!cargo_hold || !cargo_hold.total_report) return "Nothing" - cargo_hold.total_report.total_value = sortTim(cargo_hold.total_report.total_value, cmp = GLOBAL_PROC_REF(cmp_numeric_dsc), associative = TRUE) + sortTim(cargo_hold.total_report.total_value, cmp = GLOBAL_PROC_REF(cmp_numeric_dsc), associative = TRUE) var/count = 0 var/list/loot_texts = list() for(var/datum/export/E in cargo_hold.total_report.total_value) diff --git a/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm b/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm index eaa1de48b58..16cad321853 100644 --- a/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm +++ b/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm @@ -428,7 +428,7 @@ /datum/export/pirate/ransom/sell_object(mob/living/carbon/human/sold_item, datum/export_report/report, dry_run = TRUE, apply_elastic = TRUE) . = ..() - if(. == EXPORT_NOT_SOLD) + if(. == EXPORT_NOT_SOLD || dry_run) return var/turf/picked_turf = pick(GLOB.holdingfacility) sold_item.forceMove(picked_turf) @@ -439,7 +439,7 @@ sold_item.flash_act() sold_item.adjust_confusion(10 SECONDS) sold_item.adjust_dizzy(10 SECONDS) - addtimer(src, CALLBACK(src, PROC_REF(send_back_to_station), sold_item), COME_BACK_FROM_CAPTURE_TIME) + addtimer(CALLBACK(src, PROC_REF(send_back_to_station), sold_item), COME_BACK_FROM_CAPTURE_TIME) to_chat(sold_item, span_hypnophrase("A million voices echo in your head... \"Yaarrr, thanks for the booty, landlubber. \ You will be ransomed back to your station, so it's only a matter of time before we ship you back...")) diff --git a/code/modules/antagonists/spy/spy_uplink.dm b/code/modules/antagonists/spy/spy_uplink.dm index 88e091310ca..5de66271fe2 100644 --- a/code/modules/antagonists/spy/spy_uplink.dm +++ b/code/modules/antagonists/spy/spy_uplink.dm @@ -56,7 +56,7 @@ /datum/component/spy_uplink/proc/on_attack_self(obj/item/source, mob/user) SIGNAL_HANDLER - if(is_our_spy(user)) + if(IS_SPY(user)) INVOKE_ASYNC(src, TYPE_PROC_REF(/datum, ui_interact), user) return NONE @@ -65,7 +65,7 @@ if(!ismovable(target)) return NONE - if(!is_our_spy(user)) + if(!IS_SPY(user)) return NONE if(!try_steal(target, user)) return NONE diff --git a/code/modules/asset_cache/assets/uplink.dm b/code/modules/asset_cache/assets/uplink.dm index e283b86c042..e85ee1b35b5 100644 --- a/code/modules/asset_cache/assets/uplink.dm +++ b/code/modules/asset_cache/assets/uplink.dm @@ -9,7 +9,7 @@ var/list/items = list() for(var/datum/uplink_category/category as anything in subtypesof(/datum/uplink_category)) categories += category - categories = sortTim(categories, GLOBAL_PROC_REF(cmp_uplink_category_desc)) + sortTim(categories, GLOBAL_PROC_REF(cmp_uplink_category_desc)) var/list/new_categories = list() for(var/datum/uplink_category/category as anything in categories) diff --git a/code/modules/bitrunning/antagonists/ghost_role.dm b/code/modules/bitrunning/antagonists/ghost_role.dm new file mode 100644 index 00000000000..3bf88e16dfb --- /dev/null +++ b/code/modules/bitrunning/antagonists/ghost_role.dm @@ -0,0 +1,22 @@ +/datum/antagonist/domain_ghost_actor + name = "Virtual Domain Actor" + antagpanel_category = ANTAG_GROUP_GLITCH + job_rank = ROLE_GLITCH + show_to_ghosts = TRUE + suicide_cry = "FATAL ERROR" + ui_name = "AntagInfoGlitch" + +/datum/antagonist/domain_ghost_actor/on_gain() + . = ..() + owner.current.AddComponent(/datum/component/npc_friendly) //Just in case + forge_objectives() + +/datum/antagonist/domain_ghost_actor/forge_objectives() + var/datum/objective/bitrunner_ghost_fluff/objective = new() + objective.owner = owner + objectives += objective + +/datum/objective/bitrunner_ghost_fluff + +/datum/objective/bitrunner_ghost_fluff/New() + explanation_text = "Defend your domain from the intruders!" diff --git a/code/modules/bitrunning/areas.dm b/code/modules/bitrunning/areas.dm index 8ac07bcc8f2..31a2fef9f3c 100644 --- a/code/modules/bitrunning/areas.dm +++ b/code/modules/bitrunning/areas.dm @@ -26,7 +26,7 @@ /area/virtual_domain/safehouse name = "Virtual Domain Safehouse" - area_flags = UNIQUE_AREA | NOTELEPORT | ABDUCTOR_PROOF | EVENT_PROTECTED + area_flags = UNIQUE_AREA | NOTELEPORT | ABDUCTOR_PROOF | EVENT_PROTECTED | VIRTUAL_SAFE_AREA icon_state = "bit_safe" requires_power = FALSE sound_environment = SOUND_ENVIRONMENT_ROOM @@ -49,3 +49,13 @@ icon_state = "bit_space" area_flags = UNIQUE_AREA | NOTELEPORT | ABDUCTOR_PROOF | EVENT_PROTECTED | HIDDEN_AREA +///Areas that virtual entities should not be in + +/area/virtual_domain/protected_space + name = "Virtual Domain Safe Zone" + area_flags = UNIQUE_AREA | NOTELEPORT | ABDUCTOR_PROOF | EVENT_PROTECTED | VIRTUAL_SAFE_AREA + icon_state = "bit_safe" + +/area/virtual_domain/protected_space/fullbright + static_lighting = FALSE + base_lighting_alpha = 255 diff --git a/code/modules/bitrunning/components/virtual_entity.dm b/code/modules/bitrunning/components/virtual_entity.dm new file mode 100644 index 00000000000..12e5305ba9a --- /dev/null +++ b/code/modules/bitrunning/components/virtual_entity.dm @@ -0,0 +1,36 @@ +/// Handles all special considerations for "virtual entities" such as bitrunning ghost roles or digital anomaly antagonists. +/datum/component/virtual_entity + ///The cooldown for balloon alerts, so the player isn't spammed while trying to enter a restricted area. + COOLDOWN_DECLARE(OOB_cooldown) + +/datum/component/virtual_entity/Initialize(obj/machinery/quantum_server) + . = ..() + + if(quantum_server.obj_flags & EMAGGED) + jailbreak_mobs() //This just sends a message and self-deletes, a bit messy but it works. + return + + RegisterSignal(parent, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(on_parent_pre_move)) + RegisterSignal(quantum_server, COMSIG_ATOM_EMAG_ACT, PROC_REF(jailbreak_mobs)) + +///Prevents entry to a certain area if it has flags preventing virtual entities from entering. +/datum/component/virtual_entity/proc/on_parent_pre_move(atom/movable/source, atom/new_location) + SIGNAL_HANDLER + + var/area/location_area = get_area(new_location) + if(!location_area) + stack_trace("Virtual entity entered a location with no area!") + return + + if(location_area.area_flags & VIRTUAL_SAFE_AREA) + source.balloon_alert(source, "out of bounds!") + COOLDOWN_START(src, OOB_cooldown, 2 SECONDS) + return COMPONENT_MOVABLE_BLOCK_PRE_MOVE + +///Self-destructs the component, allowing free-roam by all entities with this restriction. +/datum/component/virtual_entity/proc/jailbreak_mobs() + SIGNAL_HANDLER + + to_chat(parent, span_big("You shiver for a moment, then suddenly feel a sense of clarity you haven't felt before. \ + You can go anywhere, do anything! You could leave this simulation right now if you wanted!")) + qdel(src) diff --git a/code/modules/bitrunning/server/_parent.dm b/code/modules/bitrunning/server/_parent.dm index 06b49d790a5..113ed6b2126 100644 --- a/code/modules/bitrunning/server/_parent.dm +++ b/code/modules/bitrunning/server/_parent.dm @@ -88,11 +88,14 @@ /obj/machinery/quantum_server/emag_act(mob/user, obj/item/card/emag/emag_card) . = ..() + if(obj_flags & EMAGGED) + return + obj_flags |= EMAGGED glitch_chance = 0.09 add_overlay(mutable_appearance('icons/obj/machines/bitrunning.dmi', "emag_overlay")) - balloon_alert(user, "bzzzt...") + balloon_alert(user, "system jailbroken...") playsound(src, 'sound/effects/sparks1.ogg', 35, vary = TRUE) /obj/machinery/quantum_server/update_appearance(updates) diff --git a/code/modules/bitrunning/server/threats.dm b/code/modules/bitrunning/server/threats.dm index 6c42322d0cf..58c6cbdd33c 100644 --- a/code/modules/bitrunning/server/threats.dm +++ b/code/modules/bitrunning/server/threats.dm @@ -2,6 +2,7 @@ /obj/machinery/quantum_server/proc/add_threats(mob/living/threat) spawned_threat_refs.Add(WEAKREF(threat)) SEND_SIGNAL(src, COMSIG_BITRUNNER_THREAT_CREATED) + threat.AddComponent(/datum/component/virtual_entity, src) /// Choses which antagonist role is spawned based on threat /obj/machinery/quantum_server/proc/get_antagonist_role() diff --git a/code/modules/bitrunning/spawners.dm b/code/modules/bitrunning/spawners.dm new file mode 100644 index 00000000000..4f8aab322ff --- /dev/null +++ b/code/modules/bitrunning/spawners.dm @@ -0,0 +1,51 @@ +/obj/effect/mob_spawn/ghost_role/human/virtual_domain + outfit = /datum/outfit/pirate + prompt_name = "a virtual domain debug entity" + flavour_text = "You probably shouldn't be seeing this, contact a coder!" + you_are_text = "You are NOT supposed to be here. How did you let this happen?" + +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/Initialize(mapload) + . = ..() + notify_ghosts("The [name] has been created. The virtual world calls for aid!", src, "Virtual Insanity!") + +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/special(mob/living/spawned_mob, mob/mob_possessor) + . = ..() + + spawned_mob.mind.add_antag_datum(/datum/antagonist/domain_ghost_actor) + +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/pirate + name = "Virtual Pirate Remains" + desc = "Some inanimate bones. They feel like they could spring to life at any moment!" + density = FALSE + icon = 'icons/effects/blood.dmi' + icon_state = "remains" + prompt_name = "a virtual skeleton pirate" + you_are_text = "You are a virtual pirate. Yarrr!" + flavour_text = "You have awoken, without instruction. There's a LANDLUBBER after yer booty. Stop them!" + +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/pirate/special(mob/living/spawned_mob, mob/mob_possessor) + . = ..() + spawned_mob.fully_replace_character_name(spawned_mob.real_name, "[pick(strings(PIRATE_NAMES_FILE, "generic_beginnings"))][pick(strings(PIRATE_NAMES_FILE, "generic_endings"))]") + +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/syndie + name = "Virtual Syndicate Sleeper" + icon = 'icons/obj/machines/sleeper.dmi' + icon_state = "sleeper_s" + prompt_name = "a virtual syndicate operative" + you_are_text = "You are a virtual syndicate operative." + flavour_text = "You have awoken, without instruction. Alarms blare! We are being boarded!" + outfit = /datum/outfit/virtual_syndicate + spawner_job_path = /datum/job/space_syndicate + +/datum/outfit/virtual_syndicate + name = "Virtual Syndie" + id = /obj/item/card/id/advanced/chameleon + id_trim = /datum/id_trim/chameleon/operative + uniform = /obj/item/clothing/under/syndicate + back = /obj/item/storage/backpack + gloves = /obj/item/clothing/gloves/tackler/combat/insulated + shoes = /obj/item/clothing/shoes/combat + implants = list(/obj/item/implant/weapons_auth) + +/datum/outfit/virtual_syndicate/post_equip(mob/living/carbon/human/user, visualsOnly) + user.faction |= ROLE_SYNDICATE diff --git a/code/modules/cargo/bounties/assistant.dm b/code/modules/cargo/bounties/assistant.dm index 636b4f4791b..d4ef4b6a148 100644 --- a/code/modules/cargo/bounties/assistant.dm +++ b/code/modules/cargo/bounties/assistant.dm @@ -198,11 +198,11 @@ wanted_types = list(/obj/item/pneumatic_cannon/ghetto = TRUE) /datum/bounty/item/assistant/improvised_shells - name = "Improvised Shotgun Shells" - description = "Budget cuts are hitting our security department pretty hard. Send some improvised shotgun shells when you can." + name = "Junk Shells" + description = "Our assistant militia has chewed through all our iron supplies. To stop them making bullets out of station property, we need junk shells, pronto." reward = CARGO_CRATE_VALUE * 4 required_count = 5 - wanted_types = list(/obj/item/ammo_casing/shotgun/improvised = TRUE) + wanted_types = list(/obj/item/ammo_casing/junk = TRUE) /datum/bounty/item/assistant/flamethrower name = "Flamethrower" diff --git a/code/modules/cargo/markets/market_item.dm b/code/modules/cargo/markets/market_item.dm index 51651ffdc47..21ff3d01deb 100644 --- a/code/modules/cargo/markets/market_item.dm +++ b/code/modules/cargo/markets/market_item.dm @@ -16,6 +16,9 @@ /// Path to or the item itself what this entry is for, this should be set even if you override spawn_item to spawn your item. var/atom/movable/item + /// Used to exclude abstract/special paths from the unit test if the value matches the type itself. + var/abstract_path + /// Minimum price for the item if generated randomly. var/price_min = 0 /// Maximum price for the item if generated randomly. @@ -25,7 +28,7 @@ /// Maximum amount that there should be of this item in the market if generated randomly. var/stock_max = 0 /// Probability for this item to be available. Used by SSblackmarket on init. - var/availability_prob = 0 + var/availability_prob ///The identifier for the market item, generated on runtime and used to access them in the market categories. var/identifier diff --git a/code/modules/cargo/markets/market_items/clothing.dm b/code/modules/cargo/markets/market_items/clothing.dm index bf705e8b572..82bda848eb8 100644 --- a/code/modules/cargo/markets/market_items/clothing.dm +++ b/code/modules/cargo/markets/market_items/clothing.dm @@ -1,5 +1,6 @@ /datum/market_item/clothing category = "Clothing" + abstract_path = /datum/market_item/clothing /datum/market_item/clothing/ninja_mask name = "Space Ninja Mask" diff --git a/code/modules/cargo/markets/market_items/consumables.dm b/code/modules/cargo/markets/market_items/consumables.dm index 5550d31c5f8..f002ff99424 100644 --- a/code/modules/cargo/markets/market_items/consumables.dm +++ b/code/modules/cargo/markets/market_items/consumables.dm @@ -1,5 +1,6 @@ /datum/market_item/consumable category = "Consumables" + abstract_path = /datum/market_item/consumable /datum/market_item/consumable/clown_tears name = "Bottle of Clown's Tears" diff --git a/code/modules/cargo/markets/market_items/hostages.dm b/code/modules/cargo/markets/market_items/hostages.dm index 6551ee6156b..ed5b1f10a7f 100644 --- a/code/modules/cargo/markets/market_items/hostages.dm +++ b/code/modules/cargo/markets/market_items/hostages.dm @@ -1,6 +1,7 @@ ///A special category for mobs captured by pirates, tots and contractors, should someone ever want to get them back in advance. /datum/market_item/hostage category = "Hostages" + abstract_path = /datum/market_item/hostage stock = 1 availability_prob = 100 shipping_override = list(SHIPPING_METHOD_LTSRBT = 0, SHIPPING_METHOD_SUPPLYPOD = 350) diff --git a/code/modules/cargo/markets/market_items/misc.dm b/code/modules/cargo/markets/market_items/misc.dm index 5d5f406d139..9ce3ec43bba 100644 --- a/code/modules/cargo/markets/market_items/misc.dm +++ b/code/modules/cargo/markets/market_items/misc.dm @@ -1,5 +1,6 @@ /datum/market_item/misc category = "Miscellaneous" + abstract_path = /datum/market_item/misc /datum/market_item/misc/Clear_PDA name = "Clear PDA" @@ -53,6 +54,7 @@ /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." + item = /obj/item/mod/module/shove_blocker price_min = CARGO_CRATE_VALUE * 4 price_max = CARGO_CRATE_VALUE * 5.75 stock_max = 1 @@ -108,6 +110,7 @@ /datum/market_item/misc/jawed_hook name = "Jawed Fishing Hook" desc = "The thing ya use if y'are strugglin' with fishes. Just rememeber to whoop yer rod before it's too late, 'cause this thing's gonna hurt them like an Arkansas toothpick." + item = /obj/item/fishing_hook/jaws price_min = CARGO_CRATE_VALUE * 0.75 price_max = CARGO_CRATE_VALUE * 2 stock_max = 3 diff --git a/code/modules/cargo/markets/market_items/stolen_goods.dm b/code/modules/cargo/markets/market_items/stolen_goods.dm index c9c17f1d2b6..02a72f05d26 100644 --- a/code/modules/cargo/markets/market_items/stolen_goods.dm +++ b/code/modules/cargo/markets/market_items/stolen_goods.dm @@ -1,6 +1,7 @@ ///A special category for goods stolen by spies for their bounties. /datum/market_item/stolen_good category = "Fenced Goods" + abstract_path = /datum/market_item/stolen_good stock = 1 availability_prob = 100 diff --git a/code/modules/cargo/markets/market_items/tools.dm b/code/modules/cargo/markets/market_items/tools.dm index 5d036fae0ef..9576810b3a3 100644 --- a/code/modules/cargo/markets/market_items/tools.dm +++ b/code/modules/cargo/markets/market_items/tools.dm @@ -1,5 +1,6 @@ /datum/market_item/tool category = "Tools" + abstract_path = /datum/market_item/tool /datum/market_item/tool/blackmarket_telepad name = "Black Market LTSRBT" diff --git a/code/modules/cargo/markets/market_items/weapons.dm b/code/modules/cargo/markets/market_items/weapons.dm index 11f242d57c8..3323e169162 100644 --- a/code/modules/cargo/markets/market_items/weapons.dm +++ b/code/modules/cargo/markets/market_items/weapons.dm @@ -1,5 +1,6 @@ /datum/market_item/weapon category = "Weapons" + abstract_path = /datum/market_item/weapon /datum/market_item/weapon/bear_trap name = "Bear Trap" diff --git a/code/modules/cargo/packs/security.dm b/code/modules/cargo/packs/security.dm index b8e93f2815c..e36f9f84cac 100644 --- a/code/modules/cargo/packs/security.dm +++ b/code/modules/cargo/packs/security.dm @@ -169,6 +169,7 @@ /obj/item/clothing/mask/whistle, /obj/item/conversion_kit, ) + crate_name = "traditional equipment crate" discountable = SUPPLY_PACK_RARE_DISCOUNTABLE /// Armory packs diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index b25d7c2e5ae..2b143fbd4ec 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -125,6 +125,9 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( no_tgui_adminhelp(input(src, "Enter your ahelp", "Ahelp") as null|message) return + if(href_list["commandbar_typing"]) + handle_commandbar_typing(href_list) + switch(href_list["_src_"]) if("holder") hsrc = holder @@ -258,6 +261,8 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( tgui_say = new(src, "tgui_say") + initialize_commandbar_spy() + set_right_click_menu_mode(TRUE) GLOB.ahelp_tickets.ClientLogin(src) @@ -511,7 +516,6 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( "[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]>" : ""]" ) 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 // This way hopefully any users of request_ban_cache will never need to yield @@ -541,6 +545,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( 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.")) update_ambience_pref() + check_ip_intel() //This is down here because of the browse() calls in tooltip/New() if(!tooltips) @@ -864,15 +869,6 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( qdel(query_get_notes) create_message("note", key, system_ckey, message, null, null, 0, 0, null, 0, 0) - -/client/proc/check_ip_intel() - set waitfor = 0 //we sleep when getting the intel, no need to hold up the client connection while we sleep - if (CONFIG_GET(string/ipintel_email)) - var/datum/ipintel/res = get_ip_intel(address) - if (res.intel >= CONFIG_GET(number/ipintel_rating_bad)) - message_admins(span_adminnotice("Proxy Detection: [key_name_admin(src)] IP intel rated [res.intel*100]% likely to be a Proxy/VPN.")) - ip_intel = res.intel - /client/Click(atom/object, atom/location, control, params) if(click_intercept_time) if(click_intercept_time >= world.time) diff --git a/code/modules/client/verbs/typing.dm b/code/modules/client/verbs/typing.dm new file mode 100644 index 00000000000..b7a73622614 --- /dev/null +++ b/code/modules/client/verbs/typing.dm @@ -0,0 +1,70 @@ +#define IC_VERBS list("say", "me", "whisper") + +/client/var/commandbar_thinking = FALSE +/client/var/commandbar_typing = FALSE + +/client/proc/initialize_commandbar_spy() + src << output('html/typing_indicator.html', "commandbar_spy") + +/client/proc/handle_commandbar_typing(href_list) + if (!typing_indicators) //check pref + return + if (length(href_list["verb"]) < 1 || !(LOWER_TEXT(href_list["verb"]) in IC_VERBS) || text2num(href_list["argument_length"]) < 1) + if (commandbar_typing) + commandbar_typing = FALSE + stop_typing() + + if (commandbar_thinking) + commandbar_thinking = FALSE + stop_thinking() + return + + if (!commandbar_thinking) + commandbar_thinking = TRUE + start_thinking() + + if (!commandbar_typing) + commandbar_typing = TRUE + start_typing() + + +/** Sets the mob as "thinking" - with indicator and the TRAIT_THINKING_IN_CHARACTER trait */ +/client/proc/start_thinking() + if(!typing_indicators) + return FALSE + /// Special exemptions + if(isabductor(mob)) + return FALSE + ADD_TRAIT(mob, TRAIT_THINKING_IN_CHARACTER, CURRENTLY_TYPING_TRAIT) + mob.create_thinking_indicator() + +/** Removes typing/thinking indicators and flags the mob as not thinking */ +/client/proc/stop_thinking() + mob?.remove_all_indicators() + +/** + * Handles the user typing. After a brief period of inactivity, + * signals the client mob to revert to the "thinking" icon. + */ +/client/proc/start_typing() + var/mob/client_mob = mob + client_mob.remove_thinking_indicator() + if(!typing_indicators || !HAS_TRAIT(client_mob, TRAIT_THINKING_IN_CHARACTER)) + return FALSE + client_mob.create_typing_indicator() + addtimer(CALLBACK(src, PROC_REF(stop_typing)), 5 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE | TIMER_STOPPABLE) + +/** + * Callback to remove the typing indicator after a brief period of inactivity. + * If the user was typing IC, the thinking indicator is shown. + */ +/client/proc/stop_typing() + if(isnull(mob)) + return FALSE + var/mob/client_mob = mob + client_mob.remove_typing_indicator() + if(!typing_indicators || !HAS_TRAIT(client_mob, TRAIT_THINKING_IN_CHARACTER)) + return FALSE + client_mob.create_thinking_indicator() + +#undef IC_VERBS diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index 55d3bb1212a..c6d7539bb4e 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -246,8 +246,10 @@ interaction_flags_click = FORBID_TELEKINESIS_REACH|ALLOW_RESTING ///prefix our phrases must begin with var/prefix = "go go gadget" - ///an assoc list of phrase = item (like gun = revolver) - var/list/items_by_phrase = list() + ///an assoc list of regex = item (like regex datum = revolver item) + var/list/items_by_regex = list() + ///A an assoc list of regex = phrase (like regex datum = gun text) + var/list/phrases_by_regex = list() ///how many gadgets can we hold var/max_items = 4 ///items above this weight cannot be put in the hat @@ -258,36 +260,58 @@ become_hearing_sensitive(ROUNDSTART_TRAIT) QDEL_NULL(atom_storage) +/obj/item/clothing/head/fedora/inspector_hat/proc/set_prefix(desired_prefix) + + prefix = desired_prefix + + // Regenerated the phrases here. + for(var/old_regex in phrases_by_regex) + var/old_phrase = phrases_by_regex[old_regex] + var/obj/item/old_item = items_by_regex[old_regex] + items_by_regex -= old_regex + phrases_by_regex -= old_regex + set_phrase(old_phrase,old_item) + + return TRUE + +/obj/item/clothing/head/fedora/inspector_hat/proc/set_phrase(desired_phrase,obj/item/associated_item) + + var/regex/phrase_regex = regex("[prefix]\[\\s\\W\]+[desired_phrase]","i") + + phrases_by_regex[phrase_regex] = desired_phrase + items_by_regex[phrase_regex] = associated_item + + return TRUE + /obj/item/clothing/head/fedora/inspector_hat/examine(mob/user) . = ..() . += span_notice("You can put items inside, and get them out by saying a phrase, or using it in-hand!") . += span_notice("The prefix is [prefix], and you can change it with alt-click!\n") - for(var/phrase in items_by_phrase) - var/obj/item/item = items_by_phrase[phrase] - . += span_notice("[icon2html(item, user)] You can remove [item] by saying \"[prefix] [phrase]\"!") + for(var/found_regex in phrases_by_regex) + var/found_phrase = phrases_by_regex[found_regex] + var/obj/item/found_item = items_by_regex[found_regex] + . += span_notice("[icon2html(found_item, user)] You can remove [found_item] by saying \"[prefix] [found_phrase]\"!") /obj/item/clothing/head/fedora/inspector_hat/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), message_range) . = ..() var/mob/living/carbon/wearer = loc if(!istype(wearer) || speaker != wearer) //if we are worn - return FALSE + return raw_message = htmlrendertext(raw_message) - var/prefix_index = findtext(raw_message, prefix) - if(prefix_index != 1) - return FALSE - var/the_phrase = trim_left(replacetext(raw_message, prefix, "")) - var/obj/item/result = items_by_phrase[the_phrase] - if(!result) - return FALSE - - if(wearer.put_in_active_hand(result)) - wearer.visible_message(span_warning("[src] drops [result] into the hands of [wearer]!")) - else - balloon_alert(wearer, "cant put in hands!") - - return TRUE + for(var/regex/found_regex as anything in phrases_by_regex) + if(!found_regex.Find(raw_message)) + continue + var/obj/item/found_item = items_by_regex[found_regex] + if(wearer.put_in_hands(found_item)) + wearer.visible_message(span_warning("[src] drops [found_item] into the hands of [wearer]!")) + . = TRUE + else + balloon_alert(wearer, "can't put in hands!") + break + + return . /obj/item/clothing/head/fedora/inspector_hat/attackby(obj/item/item, mob/user, params) . = ..() @@ -299,51 +323,61 @@ balloon_alert(user, "too big!") return - var/input = tgui_input_text(user, "What is the activation phrase?", "Activation phrase", "gadget", max_length = 26) - if(!input || !user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) - return - if(input in items_by_phrase) - balloon_alert(user, "already used!") + var/desired_phrase = tgui_input_text(user, "What is the activation phrase?", "Activation phrase", "gadget", max_length = 26) + if(!desired_phrase || !user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) return if(item.loc != user || !user.transferItemToLoc(item, src)) return - to_chat(user, span_notice("You install [item] into the [thtotext(contents.len)] slot in [src].")) + to_chat(user, span_notice("You install [item] into the [thtotext(contents.len)] slot of [src].")) playsound(src, 'sound/machines/click.ogg', 30, TRUE) - items_by_phrase[input] = item + set_phrase(desired_phrase,item) + + return TRUE /obj/item/clothing/head/fedora/inspector_hat/attack_self(mob/user) . = ..() - var/phrase = tgui_input_list(user, "What item do you want to remove by phrase?", "Item Removal", items_by_phrase) - if(!phrase || !user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) - return - user.put_in_inactive_hand(items_by_phrase[phrase]) + if(!length(items_by_regex)) + return CLICK_ACTION_BLOCKING + var/list/found_items = list() + for(var/found_regex in items_by_regex) + found_items += items_by_regex[found_regex] + var/obj/found_item = tgui_input_list(user, "What item do you want to remove?", "Item Removal", found_items) + if(!found_item || !user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) + return CLICK_ACTION_BLOCKING + user.put_in_inactive_hand(found_item) /obj/item/clothing/head/fedora/inspector_hat/click_alt(mob/user) var/new_prefix = tgui_input_text(user, "What should be the new prefix?", "Activation prefix", prefix, max_length = 24) if(!new_prefix || !user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) return CLICK_ACTION_BLOCKING - prefix = new_prefix + set_prefix(new_prefix) return CLICK_ACTION_SUCCESS /obj/item/clothing/head/fedora/inspector_hat/Exited(atom/movable/gone, direction) . = ..() - for(var/phrase in items_by_phrase) - var/obj/item/result = items_by_phrase[phrase] - if(gone == result) - items_by_phrase -= phrase - return + for(var/found_regex in items_by_regex) + var/obj/item/found_item = items_by_regex[found_regex] + if(gone != found_item) + continue + items_by_regex -= found_regex + phrases_by_regex -= found_regex + break /obj/item/clothing/head/fedora/inspector_hat/atom_destruction(damage_flag) - for(var/phrase in items_by_phrase) - var/obj/item/result = items_by_phrase[phrase] - result.forceMove(drop_location()) - items_by_phrase = null + + var/atom/atom_location = drop_location() + for(var/found_regex in items_by_regex) + var/obj/item/result = items_by_regex[found_regex] + result.forceMove(atom_location) + items_by_regex -= found_regex + phrases_by_regex -= found_regex + return ..() /obj/item/clothing/head/fedora/inspector_hat/Destroy() - QDEL_LIST_ASSOC(items_by_phrase) + QDEL_LIST_ASSOC(items_by_regex) //Anything that failed to drop gets deleted. return ..() //Mime diff --git a/code/modules/clothing/suits/jacket.dm b/code/modules/clothing/suits/jacket.dm index 6db889032c0..9004f773e35 100644 --- a/code/modules/clothing/suits/jacket.dm +++ b/code/modules/clothing/suits/jacket.dm @@ -54,6 +54,16 @@ desc = "Aviators not included." icon_state = "bomberjacket" inhand_icon_state = "brownjsuit" + allowed = list( + /obj/item/flashlight, + /obj/item/tank/internals/emergency_oxygen, + /obj/item/tank/internals/plasmaman, + /obj/item/toy, + /obj/item/storage/fancy/cigarettes, + /obj/item/lighter, + /obj/item/gun/ballistic/rifle/boltaction/pipegun, + /obj/item/radio, + ) /obj/item/clothing/suit/jacket/leather name = "leather jacket" @@ -62,7 +72,19 @@ inhand_icon_state = "hostrench" resistance_flags = NONE max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT - allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/gun/ballistic/automatic/pistol, /obj/item/gun/ballistic/revolver, /obj/item/gun/ballistic/revolver/c38/detective, /obj/item/radio) + allowed = list( + /obj/item/flashlight, + /obj/item/tank/internals/emergency_oxygen, + /obj/item/tank/internals/plasmaman, + /obj/item/toy, + /obj/item/storage/fancy/cigarettes, + /obj/item/lighter, + /obj/item/gun/ballistic/automatic/pistol, + /obj/item/gun/ballistic/revolver, + /obj/item/gun/ballistic/revolver/c38/detective, + /obj/item/gun/ballistic/rifle/boltaction/pipegun, + /obj/item/radio, + ) /obj/item/clothing/suit/jacket/leather/biker name = "biker jacket" @@ -96,7 +118,19 @@ desc = "A canvas jacket styled after classical American military garb. Feels sturdy, yet comfortable." icon_state = "militaryjacket" inhand_icon_state = null - allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/gun/ballistic/automatic/pistol, /obj/item/gun/ballistic/revolver, /obj/item/radio) + allowed = list( + /obj/item/flashlight, + /obj/item/tank/internals/emergency_oxygen, + /obj/item/tank/internals/plasmaman, + /obj/item/toy, + /obj/item/storage/fancy/cigarettes, + /obj/item/lighter, + /obj/item/gun/ballistic/automatic/pistol, + /obj/item/gun/ballistic/revolver, + /obj/item/gun/ballistic/revolver/c38/detective, + /obj/item/gun/ballistic/rifle/boltaction/pipegun, + /obj/item/radio, + ) /obj/item/clothing/suit/jacket/letterman name = "letterman jacket" @@ -118,6 +152,19 @@ icon_state = "letterman_s" inhand_icon_state = null species_exception = list(/datum/species/golem) + allowed = list( + /obj/item/flashlight, + /obj/item/tank/internals/emergency_oxygen, + /obj/item/tank/internals/plasmaman, + /obj/item/toy, + /obj/item/storage/fancy/cigarettes, + /obj/item/lighter, + /obj/item/gun/ballistic/automatic/pistol, + /obj/item/gun/ballistic/revolver, + /obj/item/gun/ballistic/revolver/c38/detective, + /obj/item/gun/ballistic/rifle/boltaction/pipegun, + /obj/item/radio, + ) /obj/item/clothing/suit/jacket/letterman_nanotrasen name = "blue letterman jacket" diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index a8b2a52ff04..fe6fce092a4 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -179,7 +179,7 @@ /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/t_scanner, - /obj/item/gun/ballistic/rifle/boltaction/pipegun/prime, + /obj/item/gun/ballistic/rifle/boltaction/pipegun, ) resistance_flags = NONE species_exception = list(/datum/species/golem) diff --git a/code/modules/clothing/suits/wetfloor.dm b/code/modules/clothing/suits/wetfloor.dm index 390a529710a..17bef117ca6 100644 --- a/code/modules/clothing/suits/wetfloor.dm +++ b/code/modules/clothing/suits/wetfloor.dm @@ -19,7 +19,7 @@ allowed = list( /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, - /obj/item/gun/ballistic/rifle/boltaction/pipegun/prime, + /obj/item/gun/ballistic/rifle/boltaction/pipegun, ) /datum/armor/suit_caution diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index 1de7ed331e9..68f0e4817f2 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -51,10 +51,15 @@ if(random_sensor) //make the sensor mode favor higher levels, except coords. sensor_mode = pick(SENSOR_VITALS, SENSOR_VITALS, SENSOR_VITALS, SENSOR_LIVING, SENSOR_LIVING, SENSOR_COORDS, SENSOR_COORDS, SENSOR_OFF) - if(!unique_reskin) // Already registered via unique reskin - register_context() + register_context() AddElement(/datum/element/update_icon_updates_onmob, flags = ITEM_SLOT_ICLOTHING|ITEM_SLOT_OCLOTHING, body = TRUE) +/obj/item/clothing/under/setup_reskinning() + if(!check_setup_reskinning()) + return + + // We already register context in Initialize. + RegisterSignal(src, COMSIG_CLICK_ALT, PROC_REF(on_click_alt_reskin)) /obj/item/clothing/under/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) . = ..() diff --git a/code/modules/clothing/under/accessories/_accessories.dm b/code/modules/clothing/under/accessories/_accessories.dm index 67c2768ad23..fdaf666638d 100644 --- a/code/modules/clothing/under/accessories/_accessories.dm +++ b/code/modules/clothing/under/accessories/_accessories.dm @@ -30,6 +30,13 @@ . = ..() register_context() +/obj/item/clothing/accessory/setup_reskinning() + if(!check_setup_reskinning()) + return + + // We already register context regardless in Initialize. + RegisterSignal(src, COMSIG_CLICK_ALT, PROC_REF(on_click_alt_reskin)) + /** * Can we be attached to the passed clothing article? */ diff --git a/code/modules/clothing/under/accessories/badges.dm b/code/modules/clothing/under/accessories/badges.dm index 21afd8aab79..5b2bda98416 100644 --- a/code/modules/clothing/under/accessories/badges.dm +++ b/code/modules/clothing/under/accessories/badges.dm @@ -195,9 +195,13 @@ GLOBAL_LIST_INIT(pride_pin_reskins, list( icon_state = "pride" obj_flags = UNIQUE_RENAME | INFINITE_RESKIN -/obj/item/clothing/accessory/pride/Initialize(mapload) - . = ..() +/obj/item/clothing/accessory/pride/setup_reskinning() unique_reskin = GLOB.pride_pin_reskins + if(!check_setup_reskinning()) + return + + // We already register context regardless in Initialize. + RegisterSignal(src, COMSIG_CLICK_ALT, PROC_REF(on_click_alt_reskin)) /obj/item/clothing/accessory/deaf_pin name = "deaf personnel pin" diff --git a/code/modules/events/ghost_role/abductor.dm b/code/modules/events/ghost_role/abductor.dm index dfa20885f0c..7ad20cff1eb 100644 --- a/code/modules/events/ghost_role/abductor.dm +++ b/code/modules/events/ghost_role/abductor.dm @@ -16,7 +16,7 @@ /datum/round_event/ghost_role/abductor/spawn_role() var/list/mob/dead/observer/candidates = SSpolling.poll_ghost_candidates(check_jobban = ROLE_ABDUCTOR, role = ROLE_ABDUCTOR, alert_pic = /obj/item/melee/baton/abductor, role_name_text = role_name, amount_to_pick = 2) - if(candidates.len < 2) + if(length(candidates) < 2) return NOT_ENOUGH_PLAYERS SSmapping.lazy_load_template(LAZY_TEMPLATE_KEY_ABDUCTOR_SHIPS) diff --git a/code/modules/events/ghost_role/alien_infestation.dm b/code/modules/events/ghost_role/alien_infestation.dm index 88e79fd7d60..1c0c938ce89 100644 --- a/code/modules/events/ghost_role/alien_infestation.dm +++ b/code/modules/events/ghost_role/alien_infestation.dm @@ -64,7 +64,7 @@ var/list/candidates = SSpolling.poll_ghost_candidates(check_jobban = ROLE_ALIEN, role = ROLE_ALIEN, alert_pic = /mob/living/carbon/alien/larva, role_name_text = role_name) - if(!candidates.len) + if(!length(candidates)) return NOT_ENOUGH_PLAYERS while(spawncount > 0 && vents.len && candidates.len) diff --git a/code/modules/events/ghost_role/sentience.dm b/code/modules/events/ghost_role/sentience.dm index 3aeebd298f4..e60498a90d0 100644 --- a/code/modules/events/ghost_role/sentience.dm +++ b/code/modules/events/ghost_role/sentience.dm @@ -49,8 +49,9 @@ GLOBAL_LIST_INIT(high_priority_sentience, typecacheof(list( priority_announce(sentience_report,"[command_name()] Medium-Priority Update") /datum/round_event/ghost_role/sentience/spawn_role() - var/list/mob/dead/observer/candidates - candidates = SSpolling.poll_ghost_candidates(check_jobban = ROLE_SENTIENCE, role = ROLE_SENTIENCE, alert_pic = /obj/item/slimepotion/slime/sentience, role_name_text = role_name) + var/list/mob/dead/observer/candidates = SSpolling.poll_ghost_candidates(check_jobban = ROLE_SENTIENCE, role = ROLE_SENTIENCE, alert_pic = /obj/item/slimepotion/slime/sentience, role_name_text = role_name) + if(!length(candidates)) + return NOT_ENOUGH_PLAYERS // find our chosen mob to breathe life into // Mobs have to be simple animals, mindless, on station, and NOT holograms. diff --git a/code/modules/events/holiday/xmas.dm b/code/modules/events/holiday/xmas.dm index 0ab024de6f1..850f23105cb 100644 --- a/code/modules/events/holiday/xmas.dm +++ b/code/modules/events/holiday/xmas.dm @@ -70,23 +70,25 @@ /datum/round_event_control/santa name = "Visit by Santa" holidayID = CHRISTMAS - typepath = /datum/round_event/santa + typepath = /datum/round_event/ghost_role/santa weight = 20 max_occurrences = 1 earliest_start = 30 MINUTES category = EVENT_CATEGORY_HOLIDAY description = "Spawns santa, who shall roam the station, handing out gifts." -/datum/round_event/santa +/datum/round_event/ghost_role/santa + role_name = "Santa" var/mob/living/carbon/human/santa //who is our santa? -/datum/round_event/santa/announce(fake) +/datum/round_event/ghost_role/santa/announce(fake) priority_announce("Santa is coming to town!", "Unknown Transmission") -/datum/round_event/santa/start() +/datum/round_event/ghost_role/santa/start() var/mob/chosen_one = SSpolling.poll_ghost_candidates("Santa is coming to town! Do you want to be [span_notice("Santa")]?", poll_time = 15 SECONDS, alert_pic = /obj/item/clothing/head/costume/santa, role_name_text = "santa", amount_to_pick = 1) - if(chosen_one) - santa = new /mob/living/carbon/human(pick(GLOB.blobstart)) - santa.key = chosen_one.key - var/datum/antagonist/santa/A = new - santa.mind.add_antag_datum(A) + if(isnull(chosen_one)) + return NOT_ENOUGH_PLAYERS + santa = new /mob/living/carbon/human(pick(GLOB.blobstart)) + santa.key = chosen_one.key + var/datum/antagonist/santa/A = new + santa.mind.add_antag_datum(A) diff --git a/code/modules/events/wizard/curseditems.dm b/code/modules/events/wizard/curseditems.dm index f83050fe08d..5b4d2f24a51 100644 --- a/code/modules/events/wizard/curseditems.dm +++ b/code/modules/events/wizard/curseditems.dm @@ -32,30 +32,30 @@ VOICE_MODULATORS, WIZARD_MIMICRY, ) - var/list/loadout[SLOTS_AMT] + var/list/loadout = list() var/ruins_spaceworthiness = FALSE var/ruins_wizard_loadout = FALSE switch(item_set) if(BIG_FAT_DOOBIE) - loadout[ITEM_SLOT_MASK] = /obj/item/clothing/mask/cigarette/rollie/trippy + loadout += /obj/item/clothing/mask/cigarette/rollie/trippy ruins_spaceworthiness = TRUE if(BOXING) - loadout[ITEM_SLOT_MASK] = /obj/item/clothing/mask/luchador - loadout[ITEM_SLOT_GLOVES] = /obj/item/clothing/gloves/boxing + loadout += /obj/item/clothing/mask/luchador + loadout += /obj/item/clothing/gloves/boxing ruins_spaceworthiness = TRUE if(CATGIRLS_2015) - loadout[ITEM_SLOT_HEAD] = /obj/item/clothing/head/costume/kitty - ruins_spaceworthiness = TRUE - ruins_wizard_loadout = TRUE + loadout += /obj/item/clothing/head/costume/kitty + ruins_spaceworthiness += TRUE + ruins_wizard_loadout += TRUE if(CURSED_SWORDS) - loadout[ITEM_SLOT_HANDS] = /obj/item/katana/cursed + loadout += /obj/item/katana/cursed if(VOICE_MODULATORS) - loadout[ITEM_SLOT_MASK] = /obj/item/clothing/mask/chameleon + loadout += /obj/item/clothing/mask/chameleon if(WIZARD_MIMICRY) - loadout[ITEM_SLOT_OCLOTHING] = /obj/item/clothing/suit/wizrobe - loadout[ITEM_SLOT_FEET] = /obj/item/clothing/shoes/sandal/magic - loadout[ITEM_SLOT_HEAD] = /obj/item/clothing/head/wizard + loadout += /obj/item/clothing/suit/wizrobe + loadout += /obj/item/clothing/shoes/sandal/magic + loadout += /obj/item/clothing/head/wizard ruins_spaceworthiness = TRUE var/list/mob/living/carbon/human/victims = list() @@ -67,18 +67,18 @@ continue if(item_set == CATGIRLS_2015) //Wizard code means never having to say you're sorry target.gender = FEMALE - for(var/iterable in 1 to loadout.len) - if(!loadout[iterable]) - continue + for(var/item_to_equip in loadout) + var/obj/item/new_item = new item_to_equip + var/slot_to_equip_to = ITEM_SLOT_HANDS + if(isclothing(new_item)) + var/obj/item/clothing/clothing_item = new_item + slot_to_equip_to = clothing_item.slot_flags - var/obj/item/item_type = loadout[iterable] - var/obj/item/thing = new item_type //dumb but required because of byond throwing a fit anytime new gets too close to a list - - target.dropItemToGround(target.get_item_by_slot(iterable), TRUE) - target.equip_to_slot_or_del(thing, iterable, indirect_action = TRUE) - ADD_TRAIT(thing, TRAIT_NODROP, CURSED_ITEM_TRAIT(thing)) - thing.item_flags |= DROPDEL - thing.name = "cursed " + thing.name + target.dropItemToGround(target.get_item_by_slot(slot_to_equip_to), TRUE) + target.equip_to_slot_or_del(new_item, slot_to_equip_to, indirect_action = TRUE) + ADD_TRAIT(new_item, TRAIT_NODROP, CURSED_ITEM_TRAIT(new_item)) + new_item.item_flags |= DROPDEL + new_item.name = "cursed " + new_item.name victims += target diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm index c05446d3521..8f78cb01ebc 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm @@ -150,7 +150,7 @@ ) result = /obj/item/food/croissant/throwing category = CAT_BREAD - always_available = FALSE + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED /datum/crafting_recipe/food/breaddog name = "Living dog/bread hybrid" diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm index b34cc5f36e9..4b56874eb7c 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm @@ -184,7 +184,6 @@ /datum/crafting_recipe/food/clowncake name = "clown cake" - always_available = FALSE reqs = list( /obj/item/food/cake/plain = 1, /obj/item/food/sundae = 2, @@ -192,16 +191,17 @@ ) result = /obj/item/food/cake/clown_cake category = CAT_CAKE + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED /datum/crafting_recipe/food/vanillacake name = "vanilla cake" - always_available = FALSE reqs = list( /obj/item/food/cake/plain = 1, /obj/item/food/grown/vanillapod = 2 ) result = /obj/item/food/cake/vanilla_cake category = CAT_CAKE + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED /datum/crafting_recipe/food/trumpetcake name = "Spaceman's Cake" diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm index a9f1ad23d8e..c0c99bbe652 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm @@ -132,7 +132,6 @@ /datum/crafting_recipe/food/mimetart name = "Mime tart" - always_available = FALSE reqs = list( /datum/reagent/consumable/milk = 5, /datum/reagent/consumable/sugar = 5, @@ -141,10 +140,10 @@ ) result = /obj/item/food/pie/mimetart category = CAT_PIE + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED /datum/crafting_recipe/food/berrytart name = "Berry tart" - always_available = FALSE reqs = list( /datum/reagent/consumable/milk = 5, /datum/reagent/consumable/sugar = 5, @@ -153,10 +152,10 @@ ) result = /obj/item/food/pie/berrytart category = CAT_PIE + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED /datum/crafting_recipe/food/cocolavatart name = "Chocolate Lava tart" - always_available = FALSE reqs = list( /datum/reagent/consumable/milk = 5, /datum/reagent/consumable/sugar = 5, @@ -166,6 +165,7 @@ ) result = /obj/item/food/pie/cocolavatart category = CAT_PIE + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED /datum/crafting_recipe/food/blumpkinpie name = "Blumpkin pie" diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm index b0c44629e18..7761a57fcfd 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm @@ -118,7 +118,6 @@ /datum/crafting_recipe/food/death_sandwich name = "Death Sandwich" - always_available = FALSE reqs = list( /obj/item/food/breadslice/plain = 2, /obj/item/food/salami = 4, @@ -127,6 +126,7 @@ ) result = /obj/item/food/sandwich/death category = CAT_SANDWICH + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED /datum/crafting_recipe/food/toast_sandwich name = "Toast Sandwich" diff --git a/code/modules/jobs/job_types/research_director.dm b/code/modules/jobs/job_types/research_director.dm index 1142ba033ff..bcf34c37228 100644 --- a/code/modules/jobs/job_types/research_director.dm +++ b/code/modules/jobs/job_types/research_director.dm @@ -76,7 +76,7 @@ messenger = /obj/item/storage/backpack/messenger/science chameleon_extras = /obj/item/stamp/head/rd - skillchips = list(/obj/item/skillchip/job/research_director) + skillchips = list(/obj/item/skillchip/research_director, /obj/item/skillchip/job/roboticist) /datum/outfit/job/rd/mod name = "Research Director (MODsuit)" diff --git a/code/modules/library/skill_learning/job_skillchips/research_director.dm b/code/modules/library/skill_learning/generic_skillchips/rod_suplex.dm similarity index 85% rename from code/modules/library/skill_learning/job_skillchips/research_director.dm rename to code/modules/library/skill_learning/generic_skillchips/rod_suplex.dm index 899defb1fd5..b889073909d 100644 --- a/code/modules/library/skill_learning/job_skillchips/research_director.dm +++ b/code/modules/library/skill_learning/generic_skillchips/rod_suplex.dm @@ -1,4 +1,4 @@ -/obj/item/skillchip/job/research_director +/obj/item/skillchip/research_director name = "R.D.S.P.L.X. skillchip" desc = "Knowledge of how to solve the ancient conumdrum; what happens when an unstoppable force meets an immovable object." auto_traits = list(TRAIT_ROD_SUPLEX) @@ -7,3 +7,6 @@ skill_icon = "dumbbell" activate_message = "You realise if you apply the correct force, at the correct angle, it is possible to make the immovable permanently movable." deactivate_message = "You forget how to permanently anchor a paradoxical object." + chip_category = SKILLCHIP_CATEGORY_GENERAL + skillchip_flags = NONE + slot_use = 1 diff --git a/code/modules/library/skill_learning/job_skillchips/_job.dm b/code/modules/library/skill_learning/job_skillchips/_job.dm index 87f2d47ac9c..23381d06066 100644 --- a/code/modules/library/skill_learning/job_skillchips/_job.dm +++ b/code/modules/library/skill_learning/job_skillchips/_job.dm @@ -1,11 +1,6 @@ -/// Job related skillchip category -#define SKILLCHIP_CATEGORY_JOB "job" - /obj/item/skillchip/job skillchip_flags = SKILLCHIP_RESTRICTED_CATEGORIES chip_category = SKILLCHIP_CATEGORY_JOB incompatibility_list = list(SKILLCHIP_CATEGORY_JOB) abstract_parent_type = /obj/item/skillchip/job slot_use = 2 - -#undef SKILLCHIP_CATEGORY_JOB diff --git a/code/modules/library/skill_learning/skillchip.dm b/code/modules/library/skill_learning/skillchip.dm index 9657a330527..ae40b84c64b 100644 --- a/code/modules/library/skill_learning/skillchip.dm +++ b/code/modules/library/skill_learning/skillchip.dm @@ -1,10 +1,3 @@ -// Skillchip categories -//Various skillchip categories. Use these when setting which categories a skillchip restricts being paired with -//while using the SKILLCHIP_RESTRICTED_CATEGORIES flag -/// General related skillchip category -#define SKILLCHIP_CATEGORY_GENERAL "general" - - /obj/item/skillchip name = "skillchip" desc = "This biochip integrates with user's brain to enable mastery of specific skill. Consult certified Nanotrasen neurosurgeon before use." @@ -531,5 +524,3 @@ ADD_TRAIT(source, TRAIT_UNHITTABLE_BY_PROJECTILES, SKILLCHIP_TRAIT) source.adjustStaminaLoss(20) addtimer(TRAIT_CALLBACK_REMOVE(source, TRAIT_UNHITTABLE_BY_PROJECTILES, SKILLCHIP_TRAIT), FLIP_EMOTE_DURATION + 0.1 SECONDS) - -#undef SKILLCHIP_CATEGORY_GENERAL diff --git a/code/modules/lootpanel/search_object.dm b/code/modules/lootpanel/search_object.dm index 520228e465e..4de60b04a67 100644 --- a/code/modules/lootpanel/search_object.dm +++ b/code/modules/lootpanel/search_object.dm @@ -50,6 +50,7 @@ var/build = owner.byond_build var/version = owner.byond_version if(build < 515 || (build == 515 && version < 1635)) + icon = "n/a" return icon = "[item.icon]" @@ -64,10 +65,7 @@ /// Generates the icon for the search object. This is the expensive part. /datum/search_object/proc/generate_icon(client/owner) - if(ismob(item) || length(item.overlays) > 2) - icon = costly_icon2html(item, owner, sourceonly = TRUE) - else // our pre 515.1635 fallback for normal items - icon = icon2html(item, owner, sourceonly = TRUE) + icon = costly_icon2html(item, owner, sourceonly = TRUE) /// Parent item has been altered, search object no longer valid diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm index f46c7ecebb9..8b82d4b7d77 100644 --- a/code/modules/mining/laborcamp/laborstacker.dm +++ b/code/modules/mining/laborcamp/laborstacker.dm @@ -106,7 +106,10 @@ else if(!(obj_flags & EMAGGED)) security_radio.set_frequency(FREQ_SECURITY) - security_radio.talk_into(src, "A prisoner has returned to the station. Minerals and Prisoner ID card ready for retrieval.", FREQ_SECURITY) + var/datum/record/crew/target = find_record(user_mob.real_name) + target?.wanted_status = WANTED_PAROLE + + security_radio.talk_into(src, "/p [user_mob.name] returned to the station. Minerals and Prisoner ID card ready for retrieval.", FREQ_SECURITY) user_mob.log_message("has completed their labor points goal and is now sending the gulag shuttle back to the station.", LOG_GAME) to_chat(user_mob, span_notice("Shuttle received message and will be sent shortly.")) return TRUE diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index e94b8d981ff..65644b00cc8 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -107,9 +107,9 @@ merge_type = /obj/item/stack/ore/glass GLOBAL_LIST_INIT(sand_recipes, list(\ - new /datum/stack_recipe("pile of dirt", /obj/machinery/hydroponics/soil, 3, time = 1 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_TOOLS), \ - new /datum/stack_recipe("sandstone", /obj/item/stack/sheet/mineral/sandstone, 1, 1, 50, check_density = FALSE, category = CAT_MISC),\ - new /datum/stack_recipe("aesthetic volcanic floor tile", /obj/item/stack/tile/basalt, 2, 1, 50, check_density = FALSE, category = CAT_TILES)\ + new /datum/stack_recipe("pile of dirt", /obj/machinery/hydroponics/soil, 3, time = 1 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_TOOLS), \ + new /datum/stack_recipe("sandstone", /obj/item/stack/sheet/mineral/sandstone, 1, 1, 50, crafting_flags = NONE, category = CAT_MISC),\ + new /datum/stack_recipe("aesthetic volcanic floor tile", /obj/item/stack/tile/basalt, 2, 1, 50, crafting_flags = NONE, category = CAT_TILES)\ )) /obj/item/stack/ore/glass/Initialize(mapload, new_amount, merge, list/mat_override, mat_amt) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 1eec176a67d..11dfee3b643 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -456,26 +456,32 @@ return obscured -/obj/item/proc/equip_to_best_slot(mob/M) - if(M.equip_to_appropriate_slot(src)) - M.update_held_items() +/// Tries to equip an item, store it in open storage, or in next best storage +/obj/item/proc/equip_to_best_slot(mob/user) + if(user.equip_to_appropriate_slot(src)) + user.update_held_items() return TRUE else if(equip_delay_self) return - if(M.active_storage?.attempt_insert(src, M)) + if(user.active_storage?.attempt_insert(src, user, messages = FALSE)) return TRUE - var/list/obj/item/possible = list(M.get_inactive_held_item(), M.get_item_by_slot(ITEM_SLOT_BELT), M.get_item_by_slot(ITEM_SLOT_DEX_STORAGE), M.get_item_by_slot(ITEM_SLOT_BACK)) - for(var/i in possible) - if(!i) + var/list/obj/item/possible = list( + user.get_inactive_held_item(), + user.get_item_by_slot(ITEM_SLOT_BELT), + user.get_item_by_slot(ITEM_SLOT_DEX_STORAGE), + user.get_item_by_slot(ITEM_SLOT_BACK), + ) + for(var/thing in possible) + if(isnull(thing)) continue - var/obj/item/I = i - if(I.atom_storage?.attempt_insert(src, M)) + var/obj/item/gear = thing + if(gear.atom_storage?.attempt_insert(src, user, messages = FALSE)) return TRUE - to_chat(M, span_warning("You are unable to equip that!")) + to_chat(user, span_warning("You are unable to equip that!")) return FALSE diff --git a/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spiders.dm b/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spiders.dm index f0df8749a51..e964fbc385b 100644 --- a/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spiders.dm +++ b/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spiders.dm @@ -111,6 +111,7 @@ /mob/living/basic/spider/giant/hunter/mold //skyrat edit: exists to make molds not spam the world with simple mobs basic_mob_flags = DEL_ON_DEATH + habitable_atmos = null ///Used in the caves away mission. /mob/living/basic/spider/giant/hunter/away_caves diff --git a/code/modules/mob/living/carbon/human/species_types/felinid.dm b/code/modules/mob/living/carbon/human/species_types/felinid.dm index 0d1a3afdbd3..57fd87500ec 100644 --- a/code/modules/mob/living/carbon/human/species_types/felinid.dm +++ b/code/modules/mob/living/carbon/human/species_types/felinid.dm @@ -136,10 +136,6 @@ var/datum/species/human/felinid/cat_species = soon_to_be_felinid.dna.species cat_species.original_felinid = FALSE else - // GOLDEN TODO - Make this check that they don't already have tails and ears before inserting them. - var/obj/item/organ/internal/ears/cat/kitty_ears = new - var/obj/item/organ/external/tail/cat/kitty_tail = new - // This removes the spines if they exist var/obj/item/organ/external/spines/current_spines = soon_to_be_felinid.get_organ_slot(ORGAN_SLOT_EXTERNAL_SPINES) if(current_spines) @@ -150,8 +146,12 @@ // Humans get converted directly to felinids, and the key is handled in on_species_gain. // Now when we get mob.dna.features[feature_key], it returns None, which is why the tail is invisible. // stored_feature_id is only set once (the first time an organ is inserted), so this should be safe. + var/obj/item/organ/internal/ears/cat/kitty_ears = new kitty_ears.Insert(soon_to_be_felinid, special = TRUE, movement_flags = DELETE_IF_REPLACED) - kitty_tail.Insert(soon_to_be_felinid, special = TRUE, movement_flags = DELETE_IF_REPLACED) + if(should_external_organ_apply_to(/obj/item/organ/external/tail/cat, soon_to_be_felinid)) //only give them a tail if they actually have sprites for it / are a compatible subspecies. + var/obj/item/organ/external/tail/cat/kitty_tail = new + kitty_tail.Insert(soon_to_be_felinid, special = TRUE, movement_flags = DELETE_IF_REPLACED) + if(!silent) to_chat(soon_to_be_felinid, span_boldnotice("Something is nya~t right.")) playsound(get_turf(soon_to_be_felinid), 'sound/effects/meow1.ogg', 50, TRUE, -1) @@ -172,6 +172,8 @@ qdel(old_tail) // Locate does not work on assoc lists, so we do it by hand for(var/external_organ in target_species.external_organs) + if(!should_external_organ_apply_to(external_organ, purrbated_human)) + continue if(ispath(external_organ, /obj/item/organ/external/tail)) var/obj/item/organ/external/tail/new_tail = new external_organ() new_tail.Insert(purrbated_human, special = TRUE, movement_flags = DELETE_IF_REPLACED) diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index a6f424c369b..4ad18c4653b 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -126,31 +126,26 @@ key_third_person = "flaps" message = "flaps their wings." hands_use_check = TRUE - var/wing_time = 20 + var/wing_time = 0.35 SECONDS -//SKYRAT EDIT REMOVAL BEGIN - EMOTES - Not working due to modified mutant code, will be fixed later -/* /datum/emote/living/flap/run_emote(mob/user, params, type_override, intentional) . = ..() if(. && ishuman(user)) - var/mob/living/carbon/human/H = user + var/mob/living/carbon/human/human_user = user var/open = FALSE - var/obj/item/organ/external/wings/functional/wings = H.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS) + var/obj/item/organ/external/wings/functional/wings = human_user.get_organ_slot(ORGAN_SLOT_EXTERNAL_WINGS) // open/close functional wings if(istype(wings)) if(wings.wings_open) open = TRUE - H.CloseWings() + wings.close_wings() else - H.OpenWings() + wings.open_wings() addtimer(CALLBACK(wings, open ? TYPE_PROC_REF(/obj/item/organ/external/wings/functional, open_wings) : TYPE_PROC_REF(/obj/item/organ/external/wings/functional, close_wings)), wing_time) - // play moth flutter noise if moth wing - if(istype(wings, /obj/item/organ/external/wings/moth)) - playsound(H, 'sound/voice/moth/moth_flutter.ogg', 50, TRUE) -*/ -//SKYRAT EDIT REMOVAL END + // play a flapping noise if the wing has this implemented + wings.make_flap_sound(human_user) /datum/emote/living/flap/aflap key = "aflap" diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index cd745931963..ade7828be40 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -727,7 +727,7 @@ return if(pulledby && pulledby.grab_state) to_chat(src, span_warning("You fail to stand up, you're restrained!")) - // NOVA EDIT ADDITION END + // SKYRAT EDIT ADDITION END return if(resting || body_position == STANDING_UP || HAS_TRAIT(src, TRAIT_FLOORED)) return @@ -2482,10 +2482,10 @@ GLOBAL_LIST_EMPTY(fire_appearances) /// Proc to append behavior to the condition of being floored. Called when the condition starts. /mob/living/proc/on_floored_start() + on_fall() if(body_position == STANDING_UP) //force them on the ground set_body_position(LYING_DOWN) set_lying_angle(pick(90, 270)) - on_fall() /// Proc to append behavior to the condition of being floored. Called when the condition ends. diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index b71a2a46045..ea012985275 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -280,6 +280,29 @@ qdel(src) return new_corgi +/** + * Turns the source atom into a crab crab, the peak of evolutionary design. + */ +/mob/living/carbon/human/proc/crabize() + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) + return + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT) + Paralyze(1, ignore_canstun = TRUE) + for(var/obj/item/objeto in src) + dropItemToGround(objeto) + regenerate_icons() + icon = null + SetInvisibility(INVISIBILITY_MAXIMUM) + + var/mob/living/basic/crab/new_crab = new (loc) + new_crab.set_combat_mode(TRUE) // snip snip + if(mind) + mind.transfer_to(new_crab) + + to_chat(new_crab, span_boldnotice("You have evolved into a crab!")) + qdel(src) + return new_crab + /mob/living/carbon/proc/gorillize() if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return diff --git a/code/modules/mod/mod_types.dm b/code/modules/mod/mod_types.dm index f0bca6b0980..2789763e12c 100644 --- a/code/modules/mod/mod_types.dm +++ b/code/modules/mod/mod_types.dm @@ -596,6 +596,7 @@ /obj/item/mod/module/storage/bluespace, /obj/item/mod/module/emp_shield/advanced, /obj/item/mod/module/welding, + /obj/item/mod/module/rad_protection, /obj/item/mod/module/stealth/ninja, /obj/item/mod/module/quick_carry/advanced, /obj/item/mod/module/magboot/advanced, diff --git a/code/modules/modular_computers/file_system/programs/emojipedia.dm b/code/modules/modular_computers/file_system/programs/emojipedia.dm index 6aa81b506d5..10be69cc349 100644 --- a/code/modules/modular_computers/file_system/programs/emojipedia.dm +++ b/code/modules/modular_computers/file_system/programs/emojipedia.dm @@ -14,7 +14,7 @@ /datum/computer_file/program/emojipedia/New() . = ..() // Sort the emoji list so it's easier to find things and we don't have to keep sorting on ui_data since the number of emojis can not change in-game. - emoji_list = sortTim(emoji_list, GLOBAL_PROC_REF(cmp_text_asc)) + sortTim(emoji_list, /proc/cmp_text_asc) /datum/computer_file/program/emojipedia/ui_static_data(mob_user) var/list/data = list() diff --git a/code/modules/pai/pai.dm b/code/modules/pai/pai.dm index 026aacc0e7d..356dc429d76 100644 --- a/code/modules/pai/pai.dm +++ b/code/modules/pai/pai.dm @@ -119,6 +119,9 @@ "mouse" = TRUE, "rabbit" = TRUE, "repairbot" = TRUE, + "kitten" = TRUE, + "puppy" = TRUE, + "spider" = TRUE, ) /// List of all available card overlays. var/static/list/possible_overlays = list( diff --git a/code/modules/photography/_pictures.dm b/code/modules/photography/_pictures.dm index 45fa5654ad9..3d430439b90 100644 --- a/code/modules/photography/_pictures.dm +++ b/code/modules/photography/_pictures.dm @@ -72,7 +72,6 @@ .["caption"] = caption .["pixel_size_x"] = psize_x .["pixel_size_y"] = psize_y - .["blueprints"] = has_blueprints .["logpath"] = logpath SET_SERIALIZATION_SEMVER(semvers, "1.0.0") @@ -93,8 +92,6 @@ id = input["id"] psize_x = input["pixel_size_x"] psize_y = input["pixel_size_y"] - if(input["blueprints"]) - has_blueprints = input["blueprints"] if(input["caption"]) caption = input["caption"] if(input["desc"]) diff --git a/code/modules/power/apc/apc_main.dm b/code/modules/power/apc/apc_main.dm index 73e48f1f82c..ab94f68186c 100644 --- a/code/modules/power/apc/apc_main.dm +++ b/code/modules/power/apc/apc_main.dm @@ -714,6 +714,8 @@ /obj/machinery/power/apc/proc/draw_energy(amount) var/grid_used = min(terminal?.surplus(), amount) terminal?.add_load(grid_used) + if(QDELETED(cell)) + return grid_used var/cell_used = 0 if(amount > grid_used) cell_used += cell.use(amount - grid_used, force = TRUE) diff --git a/code/modules/power/lighting/light.dm b/code/modules/power/lighting/light.dm index 0a698817602..b86cc09ab51 100644 --- a/code/modules/power/lighting/light.dm +++ b/code/modules/power/lighting/light.dm @@ -425,6 +425,10 @@ span_notice("You open [src]'s casing."), span_hear("You hear a noise.")) deconstruct() return + + if(tool.item_flags & ABSTRACT) + return + to_chat(user, span_userdanger("You stick \the [tool] into the light socket!")) if(has_power() && (tool.obj_flags & CONDUCTS_ELECTRICITY)) do_sparks(3, TRUE, src) diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index c9cbb0d3ecc..71daf214019 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -62,7 +62,7 @@ /obj/machinery/power/multitool_act_secondary(mob/living/user, obj/item/tool) return multitool_act(user, tool) -/// Called on multitool_act when we can change cable layers, override to add more conditions +/// Called on multitool_act when we can change cable layers, override to add more conditions /obj/machinery/power/proc/cable_layer_act(mob/living/user, obj/item/tool) var/choice = tgui_input_list(user, "Select Power Line For Operation", "Select Cable Layer", GLOB.cable_name_to_layer) if(isnull(choice) || QDELETED(src) || QDELETED(user) || QDELETED(tool) || !user.Adjacent(src) || !user.is_holding(tool)) @@ -176,7 +176,7 @@ var/surplus = local_apc.surplus() var/grid_used = min(surplus, amount) var/apc_used = 0 - if((amount > grid_used) && !ignore_apc) // Use from the APC's cell if there isn't enough energy from the grid. + if((amount > grid_used) && !ignore_apc && !QDELETED(local_apc.cell)) // Use from the APC's cell if there isn't enough energy from the grid. apc_used = local_apc.cell.use(amount - grid_used, force = force) if(!force && (amount < grid_used + apc_used)) // If we aren't forcing it and there isn't enough energy to supply demand, return nothing. @@ -204,7 +204,7 @@ return amount var/obj/machinery/power/apc/my_apc = my_area.apc - if(isnull(my_apc)) + if(isnull(my_apc) || QDELETED(my_apc.cell)) return FALSE return my_apc.cell.use(amount, force = force) diff --git a/code/modules/power/supermatter/supermatter_variants.dm b/code/modules/power/supermatter/supermatter_variants.dm index 9d69066a535..ebc21b2b5b0 100644 --- a/code/modules/power/supermatter/supermatter_variants.dm +++ b/code/modules/power/supermatter/supermatter_variants.dm @@ -21,6 +21,21 @@ layer = ABOVE_MOB_LAYER moveable = TRUE + +/obj/machinery/power/supermatter_crystal/shard/Initialize(mapload) + . = ..() + + register_context() + + +/obj/machinery/power/supermatter_crystal/shard/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + + if(held_item?.tool_behaviour == TOOL_WRENCH) + context[SCREENTIP_CONTEXT_LMB] = anchored ? "Unanchor" : "Anchor" + return CONTEXTUAL_SCREENTIP_SET + + /// Shard SM with it's processing disabled. /obj/machinery/power/supermatter_crystal/shard/hugbox name = "anchored supermatter shard" diff --git a/code/modules/projectiles/ammunition/ballistic/junk.dm b/code/modules/projectiles/ammunition/ballistic/junk.dm new file mode 100644 index 00000000000..99a9b637923 --- /dev/null +++ b/code/modules/projectiles/ammunition/ballistic/junk.dm @@ -0,0 +1,43 @@ +// Junk + +/obj/item/ammo_casing/junk + name = "improvised junk round" + desc = "What is in the shell? Shoot it to find out." + icon_state = "improvshell" + caliber = CALIBER_JUNK + projectile_type = /obj/projectile/bullet/junk + custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT*2, /datum/material/glass=SMALL_MATERIAL_AMOUNT*1) + +// Junk Shell Spawner; used to spawn in our random shells upon crafting + +/obj/effect/spawner/random/junk_shell + name = "junk shell spawner" + desc = "Bullet. Bullet Bullet." + icon_state = "junkround" + loot = list( + /obj/item/ammo_casing/junk = 50, + /obj/item/ammo_casing/junk/incendiary = 20, + /obj/item/ammo_casing/junk/shock = 20, + /obj/item/ammo_casing/junk/hunter = 20, + /obj/item/ammo_casing/junk/phasic = 5, + /obj/item/ammo_casing/junk/ripper = 5, + /obj/item/ammo_casing/junk/reaper = 1, + ) + +/obj/item/ammo_casing/junk/incendiary + projectile_type = /obj/projectile/bullet/incendiary/fire/junk + +/obj/item/ammo_casing/junk/phasic + projectile_type = /obj/projectile/bullet/junk/phasic + +/obj/item/ammo_casing/junk/shock + projectile_type = /obj/projectile/bullet/junk/shock + +/obj/item/ammo_casing/junk/hunter + projectile_type = /obj/projectile/bullet/junk/hunter + +/obj/item/ammo_casing/junk/ripper + projectile_type = /obj/projectile/bullet/junk/ripper + +/obj/item/ammo_casing/junk/reaper + projectile_type = /obj/projectile/bullet/junk/reaper diff --git a/code/modules/projectiles/ammunition/ballistic/shotgun.dm b/code/modules/projectiles/ammunition/ballistic/shotgun.dm index b9d8e49fbe9..26ecb8fc1d8 100644 --- a/code/modules/projectiles/ammunition/ballistic/shotgun.dm +++ b/code/modules/projectiles/ammunition/ballistic/shotgun.dm @@ -104,15 +104,6 @@ variance = 25 custom_materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*2) -/obj/item/ammo_casing/shotgun/improvised - name = "improvised shell" - desc = "A homemade shotgun casing filled with crushed glass, used to commmit vandalism and property damage." - icon_state = "improvshell" - projectile_type = /obj/projectile/bullet/pellet/shotgun_improvised - custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT*2, /datum/material/glass=SMALL_MATERIAL_AMOUNT*1) - pellets = 6 - variance = 30 - /obj/item/ammo_casing/shotgun/ion name = "ion shell" desc = "An advanced shotgun shell which uses a subspace ansible crystal to produce an effect similar to a standard ion rifle. \ diff --git a/code/modules/projectiles/boxes_magazines/internal/rifle.dm b/code/modules/projectiles/boxes_magazines/internal/rifle.dm index 5fdc182ccff..52d395725a1 100644 --- a/code/modules/projectiles/boxes_magazines/internal/rifle.dm +++ b/code/modules/projectiles/boxes_magazines/internal/rifle.dm @@ -11,13 +11,23 @@ /obj/item/ammo_box/magazine/internal/boltaction/pipegun name = "pipegun internal magazine" - caliber = CALIBER_SHOTGUN - ammo_type = /obj/item/ammo_casing/shotgun/improvised + caliber = CALIBER_JUNK + ammo_type = /obj/item/ammo_casing/junk max_ammo = 1 +/obj/item/ammo_box/magazine/internal/boltaction/pipegun/pistol + name = "pipe pistol internal magazine" + max_ammo = 3 + /obj/item/ammo_box/magazine/internal/boltaction/pipegun/prime name = "regal pipegun internal magazine" - max_ammo = 3 + max_ammo = 4 + ammo_type = /obj/item/ammo_casing/junk/reaper + +/obj/item/ammo_box/magazine/internal/boltaction/pipegun/pistol/prime + name = "regal pipe pistol internal magazine" + max_ammo = 6 + ammo_type = /obj/item/ammo_casing/junk/reaper /obj/item/ammo_box/magazine/internal/enchanted max_ammo = 1 diff --git a/code/modules/projectiles/guns/ballistic/rifle.dm b/code/modules/projectiles/guns/ballistic/rifle.dm index ac988c2541b..aeeeaad3047 100644 --- a/code/modules/projectiles/guns/ballistic/rifle.dm +++ b/code/modules/projectiles/guns/ballistic/rifle.dm @@ -259,46 +259,78 @@ . = ..() AddComponent(/datum/component/scope, range_modifier = 2) //enough range to at least be useful for stealth +/// PIPE GUNS /// + /obj/item/gun/ballistic/rifle/boltaction/pipegun name = "pipegun" - desc = "An excellent weapon for flushing out tunnel rats and enemy assistants, but its rifling leaves much to be desired." - icon = 'icons/obj/weapons/guns/ballistic.dmi' - icon_state = "musket" - inhand_icon_state = "musket" - worn_icon_state = "musket" - lefthand_file = 'icons/mob/inhands/weapons/64x_guns_left.dmi' - righthand_file = 'icons/mob/inhands/weapons/64x_guns_right.dmi' - inhand_x_dimension = 64 - inhand_y_dimension = 64 + desc = "A symbol that the true masters of this place are not those who merely inhabit it, but the one willing to twist it towards a killing intent." + icon_state = "pipegun" + inhand_icon_state = "pipegun" + worn_icon_state = "pipegun" fire_sound = 'sound/weapons/gun/sniper/shot.ogg' accepted_magazine_type = /obj/item/ammo_box/magazine/internal/boltaction/pipegun - initial_caliber = CALIBER_SHOTGUN - alternative_caliber = CALIBER_STRILKA310 - initial_fire_sound = 'sound/weapons/gun/sniper/shot.ogg' - alternative_fire_sound = 'sound/weapons/gun/shotgun/shot.ogg' - can_modify_ammo = TRUE + projectile_damage_multiplier = 1.35 + obj_flags = UNIQUE_RENAME can_bayonet = TRUE knife_x_offset = 25 knife_y_offset = 11 can_be_sawn_off = FALSE - projectile_damage_multiplier = 0.75 + trigger_guard = TRIGGER_GUARD_ALLOW_ALL - SET_BASE_PIXEL(0, 0) + SET_BASE_PIXEL(-8, 0) /obj/item/gun/ballistic/rifle/boltaction/pipegun/handle_chamber() . = ..() do_sparks(1, TRUE, src) +/obj/item/gun/ballistic/rifle/boltaction/pipegun/examine_more(mob/user) + . = ..() + . += span_notice("Looking down at the [name], you recall a tale told to you in some distant memory...") + + . += span_info("It's said that the first slaying committed on a Nanotrasen space station was by an assistant.") + . += span_info("That this act, done by toolbox, maybe spear, was what consigned their kind to a life of destitution, rejection and violence.") + . += span_info("They carry the weight of this act visibly; the grey jumpsuit. Breathing deeply filtered air. And with bloodsoaked yellow hands clenched into fists. Eyes, sharp and waiting. Hunters in the dark.") + . += span_info("Eventually, these killing spirits sought to stake a claim on the metal tombs they were trapped within. Rejecting their status. Determined to be something more.") + . += span_info("This weapon is one such tool. And it is a grim one indeed. Wrought from scrap, pulled from the station's walls and floors and the very nails holding it together.") + . += span_info("It is a symbol that the true masters of this place are not those who merely inhabit it. But the one willing to twist it towards a killing intent.") + +/obj/item/gun/ballistic/rifle/boltaction/pipegun/pistol + name = "pipe pistol" + desc = "It is foolish to think that anyone wearing the grey is incapable of hurting you, simply because they are not baring their teeth." + icon_state = "pipepistol" + inhand_icon_state = "pipepistol" + worn_icon_state = "gun" + accepted_magazine_type = /obj/item/ammo_box/magazine/internal/boltaction/pipegun/pistol + projectile_damage_multiplier = 0.50 + spread = 15 //kinda inaccurate + slot_flags = ITEM_SLOT_BELT + w_class = WEIGHT_CLASS_NORMAL + can_bayonet = FALSE + weapon_weight = WEAPON_MEDIUM + + SET_BASE_PIXEL(0, 0) + /obj/item/gun/ballistic/rifle/boltaction/pipegun/prime name = "regal pipegun" - desc = "Older, territorial assistants typically possess more valuable loot." - icon_state = "musket_prime" - inhand_icon_state = "musket_prime" - worn_icon_state = "musket_prime" + desc = "To call this 'regal' is a cruel irony. For the only noteworthy quality of nobility is in how it is wielded to kill. \ + All monarchs deserve to be crowned. But none will remember the dead tyrant for the red stain they left on the carpet." + icon_state = "regal_pipegun" + inhand_icon_state = "regal_pipegun" + worn_icon_state = "regal_pipegun" accepted_magazine_type = /obj/item/ammo_box/magazine/internal/boltaction/pipegun/prime - projectile_damage_multiplier = 1 + projectile_damage_multiplier = 2 -/// MAGICAL BOLT ACTIONS + ARCANE BARRAGE? /// +/obj/item/gun/ballistic/rifle/boltaction/pipegun/pistol/prime + name = "regal pipe pistol" + desc = "What value is there in honesty towards the dishonest? So that they might twist the arm and slit the wrist? \ + The open palm is no sign of weakness; it is to draw the eyes away from the other hand, lying in wait." + icon_state = "regal_pipepistol" + inhand_icon_state = "regal_pipepistol" + accepted_magazine_type = /obj/item/ammo_box/magazine/internal/boltaction/pipegun/pistol/prime + projectile_damage_multiplier = 1 + spread = 0 + +/// MAGICAL BOLT ACTIONS /// /obj/item/gun/ballistic/rifle/enchanted name = "enchanted bolt action rifle" diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index f4fc941c10e..0b397ddcc0b 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -36,7 +36,7 @@ /obj/item/gun/energy/fire_sounds() // What frequency the energy gun's sound will make - var/frequency_to_use + var/pitch_to_use var/obj/item/ammo_casing/energy/shot = ammo_type[select] // What percentage of the full battery a shot will expend @@ -44,15 +44,18 @@ // Ignore this on oversized/infinite cells or ammo without cost if(shot_cost_percent > 0) // The total amount of shots the fully charged energy gun can fire before running out - var/max_shots = round(100/shot_cost_percent) + var/max_shots = round(100/shot_cost_percent) - 1 // How many shots left before the energy gun's current battery runs out of energy - var/shots_left = round((round(clamp(cell.charge / cell.maxcharge, 0, 1) * 100))/shot_cost_percent) - frequency_to_use = sin((90/max_shots) * shots_left) + var/shots_left = round((round(clamp(cell.charge / cell.maxcharge, 0, 1) * 100))/shot_cost_percent) - 1 + pitch_to_use = LERP(1, 0.3, (1 - (shots_left/max_shots)) ** 2) + + var/sound/playing_sound = sound(suppressed ? suppressed_sound : fire_sound) + playing_sound.pitch = pitch_to_use if(suppressed) - playsound(src, suppressed_sound, suppressed_volume, vary_fire_sound, ignore_walls = FALSE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_distance = 0, frequency = frequency_to_use) + playsound(src, playing_sound, suppressed_volume, vary_fire_sound, ignore_walls = FALSE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_distance = 0) else - playsound(src, fire_sound, fire_sound_volume, vary_fire_sound, frequency = frequency_to_use) + playsound(src, playing_sound, fire_sound_volume, vary_fire_sound) /obj/item/gun/energy/emp_act(severity) . = ..() diff --git a/code/modules/projectiles/guns/special/medbeam.dm b/code/modules/projectiles/guns/special/medbeam.dm index 267470f1701..0ad5caf2fec 100644 --- a/code/modules/projectiles/guns/special/medbeam.dm +++ b/code/modules/projectiles/guns/special/medbeam.dm @@ -16,12 +16,7 @@ weapon_weight = WEAPON_MEDIUM -/obj/item/gun/medbeam/Initialize(mapload) - . = ..() - START_PROCESSING(SSobj, src) - /obj/item/gun/medbeam/Destroy(mob/user) - STOP_PROCESSING(SSobj, src) LoseTarget() return ..() @@ -41,6 +36,7 @@ QDEL_NULL(current_beam) active = FALSE on_beam_release(current_target) + STOP_PROCESSING(SSobj, src) current_target = null /** @@ -69,6 +65,7 @@ active = TRUE current_beam = user.Beam(current_target, icon_state="medbeam", time = 10 MINUTES, maxdistance = max_range, beam_type = /obj/effect/ebeam/medical) RegisterSignal(current_beam, COMSIG_QDELETING, PROC_REF(beam_died))//this is a WAY better rangecheck than what was done before (process check) + START_PROCESSING(SSobj, src) SSblackbox.record_feedback("tally", "gun_fired", 1, type) diff --git a/code/modules/projectiles/projectile/bullets/junk.dm b/code/modules/projectiles/projectile/bullets/junk.dm new file mode 100644 index 00000000000..344a7329113 --- /dev/null +++ b/code/modules/projectiles/projectile/bullets/junk.dm @@ -0,0 +1,71 @@ +// Junk (Pipe Pistols and Pipeguns) + +/obj/projectile/bullet/junk + name = "junk bullet" + icon_state = "trashball" + damage = 30 + embedding = list(embed_chance=15, fall_chance=3, jostle_chance=4, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.4, pain_mult=5, jostle_pain_mult=6, rip_time=10) + var/bane_mob_biotypes = MOB_ROBOTIC + var/bane_multiplier = 1.5 + var/bane_added_damage = 0 + +/obj/projectile/bullet/junk/Initialize(mapload) + . = ..() + AddElement(/datum/element/bane, mob_biotypes = bane_mob_biotypes, target_type = /mob/living, damage_multiplier = bane_multiplier, added_damage = bane_added_damage, requires_combat_mode = FALSE) + +/obj/projectile/bullet/incendiary/fire/junk + name = "burning oil" + damage = 30 + fire_stacks = 5 + suppressed = SUPPRESSED_NONE + +/obj/projectile/bullet/junk/phasic + name = "junk phasic bullet" + icon_state = "gaussphase" + projectile_phasing = PASSTABLE | PASSGLASS | PASSGRILLE | PASSCLOSEDTURF | PASSMACHINE | PASSSTRUCTURE | PASSDOORS + +/obj/projectile/bullet/junk/shock + name = "bundle of live electrical parts" + icon_state = "tesla_projectile" + damage = 15 + embedding = null + shrapnel_type = null + bane_multiplier = 3 + +/obj/projectile/bullet/junk/shock/on_hit(atom/target, blocked = 0, pierce_hit) + . = ..() + if(isliving(target)) + var/mob/living/victim = target + victim.electrocute_act(damage, src, siemens_coeff = 1, flags = SHOCK_NOSTUN) + +/obj/projectile/bullet/junk/hunter + name = "junk hunter bullet" + icon_state = "gauss" + bane_mob_biotypes = MOB_ROBOTIC | MOB_BEAST | MOB_SPECIAL + bane_multiplier = 0 + bane_added_damage = 50 + +/obj/projectile/bullet/junk/ripper + name = "junk ripper bullet" + icon_state = "redtrac" + damage = 10 + embedding = list(embed_chance=100, fall_chance=3, jostle_chance=4, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.4, pain_mult=5, jostle_pain_mult=6, rip_time=10) + wound_bonus = 10 + bare_wound_bonus = 30 + +/obj/projectile/bullet/junk/reaper + name = "junk reaper bullet" + tracer_type = /obj/effect/projectile/tracer/sniper + impact_type = /obj/effect/projectile/impact/sniper + muzzle_type = /obj/effect/projectile/muzzle/sniper + hitscan = TRUE + impact_effect_type = null + hitscan_light_intensity = 3 + hitscan_light_range = 0.75 + hitscan_light_color_override = LIGHT_COLOR_DIM_YELLOW + muzzle_flash_intensity = 5 + muzzle_flash_range = 1 + muzzle_flash_color_override = LIGHT_COLOR_DIM_YELLOW + impact_light_intensity = 5 + impact_light_range = 1 + impact_light_color_override = LIGHT_COLOR_DIM_YELLOW diff --git a/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm index 141f81e810d..3473db75d35 100644 --- a/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm @@ -100,18 +100,7 @@ Basically, we fill the time between now and 2s from now with hands based off the /datum/reagent/inverse/helgrasp/proc/spawn_hands(mob/living/carbon/affected_mob) if(!affected_mob && iscarbon(holder.my_atom))//Catch timer affected_mob = holder.my_atom - //Adapted from the end of the curse - but lasts a short time - var/grab_dir = turn(affected_mob.dir, pick(-90, 90, 180, 180)) //grab them from a random direction other than the one faced, favoring grabbing from behind - var/turf/spawn_turf = get_ranged_target_turf(affected_mob, grab_dir, 8)//Larger range so you have more time to dodge - if(!spawn_turf) - return - new/obj/effect/temp_visual/dir_setting/curse/grasp_portal(spawn_turf, affected_mob.dir) - playsound(spawn_turf, 'sound/effects/curse2.ogg', 80, TRUE, -1) - var/obj/projectile/curse_hand/hel/hand = new (spawn_turf) - hand.preparePixelProjectile(affected_mob, spawn_turf) - if(QDELETED(hand)) //safety check if above fails - above has a stack trace if it does fail - return - hand.fire() + fire_curse_hand(affected_mob) //At the end, we clear up any loose hanging timers just in case and spawn any remaining lag_remaining hands all at once. /datum/reagent/inverse/helgrasp/on_mob_delete(mob/living/affected_mob) diff --git a/code/modules/recycling/conveyor.dm b/code/modules/recycling/conveyor.dm index 6ef15929ecc..2c8ca83ca12 100644 --- a/code/modules/recycling/conveyor.dm +++ b/code/modules/recycling/conveyor.dm @@ -446,17 +446,33 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) else position = CONVEYOR_OFF -/// Called when a user clicks on this switch with an open hand. -/obj/machinery/conveyor_switch/attack_hand(mob/living/user, list/modifiers) +/obj/machinery/conveyor_switch/proc/on_user_activation(mob/user, direction) add_fingerprint(user) - if(LAZYACCESS(modifiers, RIGHT_CLICK)) - update_position(CONVEYOR_BACKWARDS) - else - update_position(CONVEYOR_FORWARD) + update_position(direction) update_appearance() update_linked_conveyors() update_linked_switches() - return TRUE + +/// Called when a user clicks on this switch with an open hand. +/obj/machinery/conveyor_switch/attack_hand(mob/user, list/modifiers) + . = ..() + on_user_activation(user, CONVEYOR_FORWARD) + +/obj/machinery/conveyor_switch/attack_hand_secondary(mob/user, list/modifiers) + on_user_activation(user, CONVEYOR_BACKWARDS) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + +/obj/machinery/conveyor_switch/attack_ai(mob/user) + return attack_hand(user) + +/obj/machinery/conveyor_switch/attack_ai_secondary(mob/user, list/modifiers) + return attack_hand_secondary(user, modifiers) + +/obj/machinery/conveyor_switch/attack_robot(mob/user) + return attack_hand(user) + +/obj/machinery/conveyor_switch/attack_robot_secondary(mob/user, list/modifiers) + return attack_hand_secondary(user, modifiers) /obj/machinery/conveyor_switch/attackby(obj/item/attacking_item, mob/user, params) if(is_wire_tool(attacking_item)) diff --git a/code/modules/research/stock_parts.dm b/code/modules/research/stock_parts.dm index 79d24b9c55a..d4cb4afefda 100644 --- a/code/modules/research/stock_parts.dm +++ b/code/modules/research/stock_parts.dm @@ -207,7 +207,7 @@ If you create T5+ please take a pass at mech_fabricator.dm. The parts being good continue part_list += component_part //Sort the parts. This ensures that higher tier items are applied first. - part_list = sortTim(part_list, GLOBAL_PROC_REF(cmp_rped_sort)) + sortTim(part_list, GLOBAL_PROC_REF(cmp_rped_sort)) return part_list /proc/cmp_rped_sort(obj/item/first_item, obj/item/second_item) diff --git a/code/modules/spells/spell_types/right_and_wrong.dm b/code/modules/spells/spell_types/right_and_wrong.dm index 7d14591bf2b..90e64752f48 100644 --- a/code/modules/spells/spell_types/right_and_wrong.dm +++ b/code/modules/spells/spell_types/right_and_wrong.dm @@ -230,9 +230,12 @@ GLOBAL_LIST_INIT(summoned_magic_objectives, list( SSevents.reschedule() if(user) - to_chat(user, span_warning("You have intensified summon events, causing them to occur more often!")) - message_admins("[ADMIN_LOOKUPFLW(user)] intensified summon events!") - user.log_message("intensified events!", LOG_GAME) + message_admins("[ADMIN_LOOKUPFLW(user)] [ismob(user) ? "":"admin triggered "]intensified summon events!") + if(ismob(user)) + to_chat(user, span_warning("You have intensified summon events, causing them to occur more often!")) + user.log_message("intensified events!", LOG_GAME) + else //admin triggered + log_admin("[key_name(user)] intensified summon events.") else log_game("Summon Events was intensified!") @@ -245,9 +248,12 @@ GLOBAL_LIST_INIT(summoned_magic_objectives, list( SSevents.toggleWizardmode() SSevents.reschedule() if(user) - to_chat(user, span_warning("You have cast summon events!")) - message_admins("[ADMIN_LOOKUPFLW(user)] summoned events!") - user.log_message("summoned events!", LOG_GAME) + message_admins("[ADMIN_LOOKUPFLW(user)] [ismob(user) ? "summoned":"admin triggered summon"] events!") + if(ismob(user)) + to_chat(user, span_warning("You have cast summon events!")) + user.log_message("summoned events!", LOG_GAME) + else //admin triggered + log_admin("[key_name(user)] summoned events.") else message_admins("Summon Events was triggered!") log_game("Summon Events was triggered!") diff --git a/code/modules/surgery/organs/external/wings/functional_wings.dm b/code/modules/surgery/organs/external/wings/functional_wings.dm index 821e83bfb1d..2c69f16f79c 100644 --- a/code/modules/surgery/organs/external/wings/functional_wings.dm +++ b/code/modules/surgery/organs/external/wings/functional_wings.dm @@ -112,19 +112,20 @@ human.remove_traits(list(TRAIT_NO_FLOATING_ANIM, TRAIT_MOVE_FLYING), SPECIES_FLIGHT_TRAIT) passtable_off(human, SPECIES_FLIGHT_TRAIT) close_wings() - human.update_body_parts() ///SPREAD OUR WINGS AND FLLLLLYYYYYY /obj/item/organ/external/wings/functional/proc/open_wings() var/datum/bodypart_overlay/mutant/wings/functional/overlay = bodypart_overlay overlay.open_wings() wings_open = TRUE + owner.update_body_parts() ///close our wings /obj/item/organ/external/wings/functional/proc/close_wings() var/datum/bodypart_overlay/mutant/wings/functional/overlay = bodypart_overlay wings_open = FALSE overlay.close_wings() + owner.update_body_parts() if(isturf(owner?.loc)) var/turf/location = loc @@ -193,6 +194,9 @@ desc = "Powered by pure edgy-teenager-notebook-scribblings. Just kidding. But seriously, how do these keep you flying?!" sprite_accessory_override = /datum/sprite_accessory/wings/skeleton +/obj/item/organ/external/wings/functional/moth/make_flap_sound(mob/living/carbon/wing_owner) + playsound(wing_owner, 'sound/voice/moth/moth_flutter.ogg', 50, TRUE) + ///mothra wings, which relate to moths. /obj/item/organ/external/wings/functional/moth/mothra name = "mothra wings" diff --git a/code/modules/surgery/organs/external/wings/moth_wings.dm b/code/modules/surgery/organs/external/wings/moth_wings.dm index 3891527a025..a8365a30fae 100644 --- a/code/modules/surgery/organs/external/wings/moth_wings.dm +++ b/code/modules/surgery/organs/external/wings/moth_wings.dm @@ -25,6 +25,9 @@ UnregisterSignal(organ_owner, list(COMSIG_HUMAN_BURNING, COMSIG_LIVING_POST_FULLY_HEAL, COMSIG_MOVABLE_PRE_MOVE)) REMOVE_TRAIT(organ_owner, TRAIT_FREE_FLOAT_MOVEMENT, REF(src)) +/obj/item/organ/external/wings/moth/make_flap_sound(mob/living/carbon/wing_owner) + playsound(wing_owner, 'sound/voice/moth/moth_flutter.ogg', 50, TRUE) + /obj/item/organ/external/wings/moth/can_soften_fall() return !burnt diff --git a/code/modules/surgery/organs/external/wings/wings.dm b/code/modules/surgery/organs/external/wings/wings.dm index 73c6fb64c79..62efd492530 100644 --- a/code/modules/surgery/organs/external/wings/wings.dm +++ b/code/modules/surgery/organs/external/wings/wings.dm @@ -13,6 +13,10 @@ /obj/item/organ/external/wings/proc/can_soften_fall() return TRUE +///Implement as needed to play a sound effect on *flap emote +/obj/item/organ/external/wings/proc/make_flap_sound(mob/living/carbon/wing_owner) + return + ///Bodypart overlay of default wings. Does not have any wing functionality /datum/bodypart_overlay/mutant/wings layers = ALL_EXTERNAL_OVERLAYS diff --git a/code/modules/surgery/organs/organ_movement.dm b/code/modules/surgery/organs/organ_movement.dm index c39541fb8ef..2889cbe0708 100644 --- a/code/modules/surgery/organs/organ_movement.dm +++ b/code/modules/surgery/organs/organ_movement.dm @@ -193,7 +193,6 @@ // The true movement is here moveToNullspace() - bodypart_owner.contents -= src bodypart_owner = null on_bodypart_remove(limb) diff --git a/code/modules/surgery/stomachpump.dm b/code/modules/surgery/stomachpump.dm index 0c9a0ce564f..25f067aef65 100644 --- a/code/modules/surgery/stomachpump.dm +++ b/code/modules/surgery/stomachpump.dm @@ -46,7 +46,7 @@ span_notice("[user] forces [target_human] to vomit, cleansing their stomach of some chemicals!"), span_notice("[user] forces [target_human] to vomit!"), ) - target_human.vomit(20, FALSE, TRUE, 1, TRUE, FALSE, purge_ratio = 0.67) //higher purge ratio than regular vomiting + target_human.vomit((MOB_VOMIT_MESSAGE | MOB_VOMIT_STUN), lost_nutrition = 20, purge_ratio = 0.67) //higher purge ratio than regular vomiting return ..() /datum/surgery_step/stomach_pump/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) @@ -55,7 +55,7 @@ display_results( user, target, - span_warning("You screw up, brusing [target_human]'s chest!"), + span_warning("You screw up, bruising [target_human]'s chest!"), span_warning("[user] screws up, brusing [target_human]'s chest!"), span_warning("[user] screws up!"), ) diff --git a/code/modules/tgui_input/say_modal/typing.dm b/code/modules/tgui_input/say_modal/typing.dm index a6367c088d6..7fc6a93f294 100644 --- a/code/modules/tgui_input/say_modal/typing.dm +++ b/code/modules/tgui_input/say_modal/typing.dm @@ -38,42 +38,31 @@ /** Sets the mob as "thinking" - with indicator and the TRAIT_THINKING_IN_CHARACTER trait */ /datum/tgui_say/proc/start_thinking() - if(!window_open || !client.typing_indicators) + if(!window_open) return FALSE - /// Special exemptions - if(isabductor(client.mob)) - return FALSE - ADD_TRAIT(client.mob, TRAIT_THINKING_IN_CHARACTER, CURRENTLY_TYPING_TRAIT) - client.mob.create_thinking_indicator() + return client.start_thinking() /** Removes typing/thinking indicators and flags the mob as not thinking */ /datum/tgui_say/proc/stop_thinking() - client.mob?.remove_all_indicators() + return client.stop_thinking() /** * Handles the user typing. After a brief period of inactivity, * signals the client mob to revert to the "thinking" icon. */ /datum/tgui_say/proc/start_typing() - var/mob/client_mob = client.mob - client_mob.remove_thinking_indicator() - if(!window_open || !client.typing_indicators || !HAS_TRAIT(client_mob, TRAIT_THINKING_IN_CHARACTER)) + if(!window_open) return FALSE - client_mob.create_typing_indicator() - addtimer(CALLBACK(src, PROC_REF(stop_typing)), 5 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE | TIMER_STOPPABLE) + return client.start_typing() /** - * Callback to remove the typing indicator after a brief period of inactivity. + * Remove the typing indicator after a brief period of inactivity or during say events. * If the user was typing IC, the thinking indicator is shown. */ /datum/tgui_say/proc/stop_typing() - if(isnull(client?.mob)) + if(!window_open) return FALSE - var/mob/client_mob = client.mob - client_mob.remove_typing_indicator() - if(!window_open || !client.typing_indicators || !HAS_TRAIT(client_mob, TRAIT_THINKING_IN_CHARACTER)) - return FALSE - client_mob.create_thinking_indicator() + client.stop_typing() /// Overrides for overlay creation /mob/living/create_thinking_indicator() diff --git a/code/modules/tutorials/_tutorial.dm b/code/modules/tutorials/_tutorial.dm index 7819a9e2b85..aecdcb7f23b 100644 --- a/code/modules/tutorials/_tutorial.dm +++ b/code/modules/tutorials/_tutorial.dm @@ -13,8 +13,7 @@ /datum/tutorial/New(mob/user) src.user = user - RegisterSignal(user, COMSIG_QDELETING, PROC_REF(destroy_self)) - RegisterSignal(user.client, COMSIG_QDELETING, PROC_REF(destroy_self)) + RegisterSignals(user, list(COMSIG_QDELETING, COMSIG_MOB_LOGOUT), PROC_REF(destroy_self)) /datum/tutorial/Destroy(force) user.client?.screen -= instruction_screen @@ -242,7 +241,13 @@ /// Dismisses the tutorial, not marking it as completed in the database. /// Call `/datum/tutorial/proc/dismiss()` instead. /datum/tutorial_manager/proc/dismiss(mob/user) - performing_ckeys -= user.ckey + // this can be null in some disconnect/mob logout cases so we use some fallbacks + var/user_ckey = user.ckey + if(!user_ckey && user.canon_client) + user_ckey = user.canon_client.ckey + if(!user_ckey && user.mind?.key) + user_ckey = ckey(user.mind.key) + performing_ckeys -= user_ckey /// Given a ckey, will mark them as being completed without affecting the database. /// Call `/datum/tutorial/proc/complete()` instead. diff --git a/code/modules/tutorials/tutorial_instruction.dm b/code/modules/tutorials/tutorial_instruction.dm index 05c95e2f754..0ad9ce6f2e0 100644 --- a/code/modules/tutorials/tutorial_instruction.dm +++ b/code/modules/tutorials/tutorial_instruction.dm @@ -7,7 +7,6 @@ layer = TUTORIAL_INSTRUCTIONS_LAYER mouse_opacity = MOUSE_OPACITY_TRANSPARENT - var/client/client var/atom/movable/screen/tutorial_instruction_text/instruction_text /atom/movable/screen/tutorial_instruction/Initialize(mapload, datum/hud/hud_owner, message, client/client) @@ -15,14 +14,12 @@ transform = transform.Scale(36, 2.5) - src.client = client animate(src, alpha = 245, time = 0.8 SECONDS, easing = SINE_EASING) instruction_text = new(src, null, message, client) vis_contents += instruction_text /atom/movable/screen/tutorial_instruction/Destroy() - client = null QDEL_NULL(instruction_text) return ..() diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index fb82c4fd748..35549c3e977 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -101,6 +101,7 @@ #include "bespoke_id.dm" #include "binary_insert.dm" #include "bitrunning.dm" +#include "blackmarket.dm" #include "blindness.dm" #include "bloody_footprints.dm" #include "breath.dm" diff --git a/code/modules/unit_tests/blackmarket.dm b/code/modules/unit_tests/blackmarket.dm new file mode 100644 index 00000000000..984e2ea8155 --- /dev/null +++ b/code/modules/unit_tests/blackmarket.dm @@ -0,0 +1,23 @@ +/// Ensures black market items have acceptable variable values. +/datum/unit_test/blackmarket + +/datum/unit_test/blackmarket/Run() + for(var/datum/market_item/prototype as anything in subtypesof(/datum/market_item)) + if(prototype::abstract_path == prototype) //skip abstract paths + continue + if(!prototype::category) + TEST_FAIL("[prototype] doesn't have a set category (or the abstract path var isn't correctly set)") + continue + if(!prototype::item) + TEST_FAIL("[prototype] doesn't have a set item (or the abstract path var isn't correctly set)") + continue + if(isnull(prototype::price) && prototype::price_max <= prototype::price_min) + TEST_FAIL("[prototype] doesn't have a correctly set random price (price_max should be higher than price_min)") + if(isnull(prototype::stock) && prototype::stock_max < prototype::stock_min) + TEST_FAIL("[prototype] doesn't have a correctly set random stock (stock_max shouldn't be lower than stock_min)") + if(!isnum(prototype::availability_prob)) + TEST_FAIL("[prototype] doesn't have a set availability_prob (must be a number)") + if(!prototype::name) + TEST_FAIL("[prototype] doesn't have a set name") + if(!prototype::desc) + TEST_FAIL("[prototype] doesn't have a set desc") diff --git a/code/modules/unit_tests/unit_test.dm b/code/modules/unit_tests/unit_test.dm index 4dc1e7f85c9..46fbafe2d2f 100644 --- a/code/modules/unit_tests/unit_test.dm +++ b/code/modules/unit_tests/unit_test.dm @@ -356,7 +356,7 @@ GLOBAL_VAR_INIT(focused_tests, focused_tests()) if(length(focused_tests)) tests_to_run = focused_tests - tests_to_run = sortTim(tests_to_run, GLOBAL_PROC_REF(cmp_unit_test_priority)) + sortTim(tests_to_run, GLOBAL_PROC_REF(cmp_unit_test_priority)) var/list/test_results = list() diff --git a/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm b/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm index 8343dc85a54..f7a866bdffe 100644 --- a/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm @@ -32,6 +32,29 @@ ADD_TRAIT(src, TRAIT_INSTANTLY_PROCESSES_BOULDERS, INNATE_TRAIT) ADD_TRAIT(src, TRAIT_BOULDER_BREAKER, INNATE_TRAIT) +/obj/item/mecha_parts/mecha_equipment/drill/attach(obj/vehicle/sealed/mecha/new_mecha, attach_right) + . = ..() + RegisterSignal(chassis, COMSIG_MOVABLE_BUMP, PROC_REF(bump_mine)) + +/obj/item/mecha_parts/mecha_equipment/drill/detach(atom/moveto) + UnregisterSignal(chassis, COMSIG_MOVABLE_BUMP) + return ..() + +/obj/item/mecha_parts/mecha_equipment/drill/Destroy() + if(chassis) + UnregisterSignal(chassis, COMSIG_MOVABLE_BUMP) + return ..() + +///Called whenever the mech bumps into something; action() handles checking if it is a mineable turf +/obj/item/mecha_parts/mecha_equipment/drill/proc/bump_mine(obj/vehicle/sealed/mecha/bumper, atom/bumped_into) + SIGNAL_HANDLER + var/list/drivers = chassis.return_drivers() + if(!LAZYLEN(drivers)) //I don't know if this is possible but just in case + return + + //Just use the first one /shrug + INVOKE_ASYNC(src, PROC_REF(action), drivers[1], bumped_into, null, TRUE) + /obj/item/mecha_parts/mecha_equipment/drill/do_after_checks(atom/target) // Gotta be close to the target if(!loc.Adjacent(target)) @@ -41,55 +64,71 @@ return FALSE return ..() -/obj/item/mecha_parts/mecha_equipment/drill/action(mob/source, atom/target, list/modifiers) - // We can only drill non-space turfs, living mobs and objects. - if(isspaceturf(target) || !(isliving(target) || isobj(target) || isturf(target))) - return - - // For whatever reason we can't drill things that acid won't even stick too, and probably - // shouldn't waste our time drilling indestructible things. - if(isobj(target)) - var/obj/target_obj = target - if(target_obj.resistance_flags & (UNACIDABLE | INDESTRUCTIBLE)) +/obj/item/mecha_parts/mecha_equipment/drill/action(mob/source, atom/target, list/modifiers, bumped) + //If bumped, only bother drilling mineral turfs + if(bumped) + if(!ismineralturf(target)) return - // You can't drill harder by clicking more. - if(!DOING_INTERACTION_WITH_TARGET(source, target) && do_after_cooldown(target, source, DOAFTER_SOURCE_MECHADRILL)) - target.visible_message(span_warning("[chassis] starts to drill [target]."), \ - span_userdanger("[chassis] starts to drill [target]..."), \ - span_hear("You hear drilling.")) - - log_message("Started drilling [target]", LOG_MECHA) - - // Drilling a turf is a one-and-done procedure. - if(isturf(target)) - // Check if we can even use the equipment to begin with. - if(!action_checks(target)) + //Prevent drilling into gibtonite more than once; code mostly from MODsuit drill + if(istype(target, /turf/closed/mineral/gibtonite)) + var/turf/closed/mineral/gibtonite/giberal_turf = target + if(giberal_turf.stage != GIBTONITE_UNSTRUCK) + playsound(chassis, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + to_chat(source, span_warning("[icon2html(src, source)] Active gibtonite ore deposit detected! Safety protocols preventing continued drilling.")) return - var/turf/T = target - T.drill_act(src, source) + else + // We can only drill non-space turfs, living mobs and objects. + if(isspaceturf(target) || !(isliving(target) || isobj(target) || isturf(target))) + return - return ..() + // For whatever reason we can't drill things that acid won't even stick too, and probably + // shouldn't waste our time drilling indestructible things. + if(isobj(target)) + var/obj/target_obj = target + if(target_obj.resistance_flags & (UNACIDABLE | INDESTRUCTIBLE)) + return - // Drilling objects and mobs is a repeating procedure. - while(do_after_mecha(target, source, drill_delay)) - if(isliving(target)) - drill_mob(target, source) - playsound(src,'sound/weapons/drill.ogg',40,TRUE) - else if(isobj(target)) - var/obj/O = target - 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) + // You can't drill harder by clicking more. + if(DOING_INTERACTION_WITH_TARGET(source, target) && do_after_cooldown(target, source, DOAFTER_SOURCE_MECHADRILL)) + return - // If we caused a qdel drilling the target, we can stop drilling them. - // Prevents starting a do_after on a qdeleted target. - if(QDELETED(target)) - break + target.visible_message(span_warning("[chassis] starts to drill [target]."), \ + span_userdanger("[chassis] starts to drill [target]..."), \ + span_hear("You hear drilling.")) + + log_message("Started drilling [target]", LOG_MECHA) + + // Drilling a turf is a one-and-done procedure. + if(isturf(target)) + // Check if we can even use the equipment to begin with. + if(!action_checks(target)) + return + + var/turf/T = target + T.drill_act(src, source) + + return ..() + + // Drilling objects and mobs is a repeating procedure. + while(do_after_mecha(target, source, drill_delay)) + if(isliving(target)) + drill_mob(target, source) + playsound(src,'sound/weapons/drill.ogg',40,TRUE) + else if(isobj(target)) + var/obj/O = target + 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. + if(QDELETED(target)) + break return ..() diff --git a/config/config.txt b/config/config.txt index 53c36151ca8..6aa85e86989 100644 --- a/config/config.txt +++ b/config/config.txt @@ -154,16 +154,26 @@ GUEST_BAN ## IPINTEL: ## This allows you to detect likely proxies by checking ips against getipintel.net -## Rating to warn at: (0.9 is good, 1 is 100% likely to be a spammer/proxy, 0.8 is 80%, etc) anything equal to or higher then this number triggers an admin warning -#IPINTEL_RATING_BAD 0.9 +## Rating to warn at: (0.8 is good, 1 is 100% likely to be a spammer/proxy, 0.8 is 80%, etc) anything equal to or higher then this number triggers an admin warning +#IPINTEL_RATING_BAD 0.8 ## Contact email, (required to use the service, leaving blank or default disables IPINTEL) #IPINTEL_EMAIL ch@nge.me -## How long to save good matches (ipintel rate limits to 15 per minute and 500 per day. so this shouldn't be too low, getipintel.net suggests 6 hours, time is in hours) (Your ip will get banned if you go over 500 a day too many times) -#IPINTEL_SAVE_GOOD 12 -## How long to save bad matches (these numbers can change as ips change hands, best not to save these for too long in case somebody gets a new ip used by a spammer/proxy before.) -#IPINTEL_SAVE_BAD 3 -## Domain name to query (leave commented out for the default, only needed if you pay getipintel.net for more querys) -#IPINTEL_DOMAIN check.getipintel.net +## Query base, if you pay for more queries this is what you want to change. +#IPINTEL_BASE check.getipintel.net +## Maximum number of queries in a minute +#IPINTEL_MAX_QUERY_MINUTE 15 +## Maximum number of queries in a day +#IPINTEL_MAX_QUERY_DAY 500 +## Whether clients which cannot be checked due to a rate limit will be denied +#IPINTEL_REJECT_RATE_LIMITED +## Whether clients which are flagged as a VPN will be denied +IPINTEL_REJECT_BAD +## Whether clients which cannot be checked due to an error of some form will be denied +#IPINTEL_REJECT_UNKNOWN +## How long to store results in the cache before they must be retrieved again. IN DAYS. +#IPINTEL_CACHE_LENGTH 7 +## How many minutes of living playtime to be automatically exempt from IPIntel. 0 for never. +#IPINTEL_EXEMPT_PLAYTIME_LIVING 0 ## Uncomment to allow web client connections #ALLOW_WEBCLIENT @@ -382,14 +392,14 @@ AUTOADMIN_RANK Game Master ## These trigger for any version below (non-inclusive) the given version, so 510 triggers on 509 or lower. ## These messages will be followed by one stating the clients current version and the required version for clarity. ## If CLIENT_WARN_POPUP is uncommented a popup window with the message will be displayed instead -#CLIENT_WARN_VERSION 511 -#CLIENT_WARN_BUILD 1421 +#CLIENT_WARN_VERSION 515 +#CLIENT_WARN_BUILD 1635 #CLIENT_WARN_POPUP -#CLIENT_WARN_MESSAGE Byond released 511 as the stable release. You can set the framerate your client runs at, which makes the game feel very different and cool. Shortly after its release we will end up using 511 client features and you will be forced to update. -CLIENT_ERROR_VERSION 511 +#CLIENT_WARN_MESSAGE Byond released 515 as the stable release. This comes bundled with a host of niceties, including image generation for UIs and :: operators. +CLIENT_ERROR_VERSION 515 CLIENT_ERROR_MESSAGE Your version of byond is not supported. Please upgrade. -## The minimum build needed for joining the server, if using 512, a good minimum build would be 1421 as that disables the Middle Mouse Button exploit. -CLIENT_ERROR_BUILD 1421 +## The minimum build needed for joining the server. +CLIENT_ERROR_BUILD 1590 ## TOPIC RATE LIMITING ## This allows you to limit how many topic calls (clicking on an interface window) the client can do in any given game second and/or game minute. diff --git a/dependencies.sh b/dependencies.sh index 781f77bb9c8..1eb3b8a34e2 100644 --- a/dependencies.sh +++ b/dependencies.sh @@ -5,7 +5,7 @@ # byond version export BYOND_MAJOR=515 -export BYOND_MINOR=1633 +export BYOND_MINOR=1637 #rust_g git tag export RUST_G_VERSION=3.1.0 diff --git a/html/changelogs/AutoChangeLog-pr-27585.yml b/html/changelogs/AutoChangeLog-pr-27585.yml deleted file mode 100644 index 6105e70440d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27585.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "SkyratBot" -delete-after: True -changes: - - balance: "Bitrunners can now earn Bepis disks, once per medium domain or above, if they scored at least an A." - - rscdel: "Bitrunners can not buy Bepis disks from their vendors." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-27586.yml b/html/changelogs/AutoChangeLog-pr-27586.yml deleted file mode 100644 index dd43731450a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27586.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SkyratBot" -delete-after: True -changes: - - bugfix: "Fixed lua scripts breaking when turfs with registered signals get deleted." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-27588.yml b/html/changelogs/AutoChangeLog-pr-27588.yml deleted file mode 100644 index f79ea04becd..00000000000 --- a/html/changelogs/AutoChangeLog-pr-27588.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Useroth" -delete-after: True -changes: - - bugfix: "Fixes transfer votes" - - refactor: "Removes modular piece of code related to electrocution that is no longer necessary." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-27686.yml b/html/changelogs/AutoChangeLog-pr-27686.yml new file mode 100644 index 00000000000..6d2f18a90fe --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-27686.yml @@ -0,0 +1,4 @@ +author: "Erol509" +delete-after: True +changes: + - rscadd: "Leashes have been stocked in a very particular vendor in the dormitories." \ No newline at end of file diff --git a/html/changelogs/archive/2024-05.yml b/html/changelogs/archive/2024-05.yml index 7cb0990839f..093c876ea13 100644 --- a/html/changelogs/archive/2024-05.yml +++ b/html/changelogs/archive/2024-05.yml @@ -128,3 +128,146 @@ ants as their reagent mogeoko: - bugfix: Ventcrawling mobs can change Z-level using multiz-decks again. +2024-05-05: + Majkl-J: + - bugfix: Fixed the scream emote being silent + - bugfix: Fixed cooldowns on emotes being incorrectly applied, indirectly fixing + the cry emote and a few others + Melbert: + - bugfix: Map vote should work better + SkyratBot: + - balance: Bitrunners can now earn Bepis disks, once per medium domain or above, + if they scored at least an A. + - rscdel: Bitrunners can not buy Bepis disks from their vendors. + - bugfix: Blood Brothers should spawn knowing what their objectives are. + - bugfix: Teams of 3 Blood Brothers will once more have an additional objective. + - bugfix: Fixed lua scripts breaking when turfs with registered signals get deleted. + - bugfix: If kidnapped and ransomed by pirates, you will now properly return to + the station automatically after 6 minutes. + - bugfix: You can no longer be kidnapped and held for ransom by cargo technicians + posing as pirates. + Useroth: + - bugfix: Fixes transfer votes + - refactor: Removes modular piece of code related to electrocution that is no longer + necessary. +2024-05-06: + Erol509: + - bugfix: Fixed Armaments station tgui error, when trying to select item. + SkyratBot: + - bugfix: fixes traditional equipment crate name + - qol: Admin modsuit now has a radiation protect module + chestlet, Lutowski: + - rscadd: Three Security skirts & a jumpsuit were added to the Peacekeeper Outfitting + Station & loadout. + - rscadd: Security officers with jumpskirt pref now spawn with the new jumpskirt, + battle dress is moved to loadout. + - qol: Feline Traits now gives a cat tongue + - qol: Cat tongue now has special saymods +2024-05-07: + SkyratBot: + - rscadd: '''puppy'' ''kitten'' and ''spider'' pai skins' + aKromatopzia: + - bugfix: moved raptor and digi cybernetics' categories +2024-05-08: + BurgerBB: + - qol: The inspector's Fedora now uses regex. When saying commands, it is much more + generous on picking up trigger word. + ReturnToZender (hitting delete on a power cable): + - rscdel: Single loose power cable in icebox maintenance + Rhials: + - balance: Virtual domain ghost roles can no longer enter the safehouse/"equipment" + areas of a domain. + - bugfix: Pirate virtual domain ghost roles will no longer make a pirate team antag + datum. + ShizCalev: + - bugfix: Inducers no longer break completely after trying to charge a PDA with + them. + SkyratBot: + - bugfix: Lootpanel now requires 515.1635 to generate most icons. TG support for + 514 ended May 1. Update your client to fix the icons. + - bugfix: You can no longer bypass construction restrictions via the crafting menu + - bugfix: A meter attached to distribution pipes in Birdshot's atmospherics has + been moved to the matching pipe layer. + - qol: temporarily soulless (deathmatch, etc) bodies dont appear as soulless on + medhud + tmyqlfpir: + - qol: Cafe and Interlink now have Disposals +2024-05-09: + "@\_MrEmre12, @\_Majkl-J": + - rscadd: Fishing pool introduced to metastation garden + - refactor: All water tiles now handle fishing through a unified fishing_datum variable + Bisar: + - balance: Knockdown effects will know consistently disarm, instead of failing to + disarm if you're already lying down. + Melbert: + - balance: To see wires in photos of blueprints, you first must squint at the photo. + SkyratBot: + - balance: Spies can now use other spies' uplinks. + - rscadd: RD's skillchip adds cyborg wires knowledge + - rscdel: You can no longer use another station's blueprint photo to look at wires + or do the traitor objective with. +2024-05-10: + GoldenAlpharex: + - bugfix: Removed another rogue cable from underneath a disconnected SMES. + GoldenAlpharex for the code, Thlumyn for the sprites: + - bugfix: Fixed smoothing turfs displaying some incorrect damaged overlays because + of a non-smoothing damage overlay of different dimensions than the smoothing + sprite used as the base. Less black void, let's go! + - image: Added smooth broken/burnt overlays for grass, meaning that it's going to + look a lot less broken when the grass tile is at the edge of a smoothing group. + Jane: + - qol: The Coroner's Ritual Knife can now sit upon Med Belts! + Melbert: + - qol: There is now a slight animation to entering a portal or teleporter. + - qol: Morgue trays (and the contents inside) are now animated on open and close + - bugfix: DNA infusing tiers works again + - bugfix: Cult can build again + - qol: Spies may spawn in less numbers, but rarely may also spawn in more numbers. + MrStonedOne & Lilah Novi: + - rscadd: Say commands typed in the command bar now trigger typing indicators + Rhials: + - balance: Virtual domain ghost roles can no longer enter the safehouse/"equipment" + areas of a domain. + - bugfix: Pirate virtual domain ghost roles will no longer make a pirate team antag + datum. + ShizCalev: + - bugfix: Cursed Items wizard event actually works again. + SkyratBot: + - bugfix: Silicons can set the teleporter destinations again. + - sound: Lasers adjust their pitch as they run out of charge, rather than frequency + - bugfix: The shuttle will no longer delete you while you are in jaunt + - qol: The labor camp shuttle properly sets people to parole after they complete + their work. + - qol: The labor camp shuttle specifies which person returned to the station. + - bugfix: space heaters now display the correct mode when the maintenance panel + is closed + - bugfix: Removed stray pixels appearing on certain parts of railing + - bugfix: Supermatter shards now have screentips with a wrench in hand + - qol: Added alt-click usage context to toggle_icon component + - rscdel: Being sacrified by a Heretic no longer gives you an incurable phobia. + - rscadd: Being sacrificed by a Heretic will drop 2-4 of your organs on the ground + and replace them with "corrupt organs" with negative effects which can be suppressed + with Holy Water. + - rscadd: Players who have been sacrificed by Heretics will experience additional + and rapidly lethal consequences for attempting to fight someone who previously + sacrificed them, as long as that person is wearing a focus. + - bugfix: Pride pins can be reskinned again with alt-click. + - bugfix: moths with functional/flight potion wings get an animation when they *flap + once again, and it makes a sound + - bugfix: fixed clients being seen as stuck doing tutorials in some cases when changing + mobs + - bugfix: Added the missing bulwark MOD module and the jawed fishing hook to the + black market. + - bugfix: The stomach pump surgery actually works again. + - spellcheck: '"brusing" to "bruising" in the message you get when failing the stomach + pump surgery.' + - qol: Mech drills can auto-mine by walking into rock. + - bugfix: conveyor switches work for cyborgs again + - bugfix: The quick equip 'E' hotkey shouldn't warn if one of your bags is full + anymore +2024-05-11: + SkyratBot: + - rscadd: Chance to become crab on nonlethal DNA meltdown +2024-05-12: + xXPawnStarrXx: + - bugfix: fixed mold spiders dying from Co2/plasma diff --git a/html/typing_indicator.html b/html/typing_indicator.html new file mode 100644 index 00000000000..2988edff55f --- /dev/null +++ b/html/typing_indicator.html @@ -0,0 +1,46 @@ + + + + + + + + + diff --git a/icons/effects/random_spawners.dmi b/icons/effects/random_spawners.dmi index 08df14c0ffc..ddd6fd6f608 100644 Binary files a/icons/effects/random_spawners.dmi and b/icons/effects/random_spawners.dmi differ diff --git a/icons/mob/clothing/back.dmi b/icons/mob/clothing/back.dmi index 30469c85dae..4fc02eaa2c0 100644 Binary files a/icons/mob/clothing/back.dmi and b/icons/mob/clothing/back.dmi differ diff --git a/icons/mob/clothing/belt_mirror.dmi b/icons/mob/clothing/belt_mirror.dmi index 37658b154db..0d44e0ce6ea 100644 Binary files a/icons/mob/clothing/belt_mirror.dmi and b/icons/mob/clothing/belt_mirror.dmi differ diff --git a/icons/mob/inhands/weapons/guns_lefthand.dmi b/icons/mob/inhands/weapons/guns_lefthand.dmi index 4c1acc9fa46..c1bcd197278 100644 Binary files a/icons/mob/inhands/weapons/guns_lefthand.dmi and b/icons/mob/inhands/weapons/guns_lefthand.dmi differ diff --git a/icons/mob/inhands/weapons/guns_righthand.dmi b/icons/mob/inhands/weapons/guns_righthand.dmi index f3a5f34e247..98788d73711 100644 Binary files a/icons/mob/inhands/weapons/guns_righthand.dmi and b/icons/mob/inhands/weapons/guns_righthand.dmi differ diff --git a/icons/mob/silicon/pai.dmi b/icons/mob/silicon/pai.dmi index 2be986d411d..260b175f3ae 100644 Binary files a/icons/mob/silicon/pai.dmi and b/icons/mob/silicon/pai.dmi differ diff --git a/icons/obj/railings.dmi b/icons/obj/railings.dmi index 7dcb4e7c6f7..49b560d2c87 100644 Binary files a/icons/obj/railings.dmi and b/icons/obj/railings.dmi differ diff --git a/icons/obj/weapons/guns/projectiles.dmi b/icons/obj/weapons/guns/projectiles.dmi index b2579d58bf2..b4056f661b8 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/guns/wide_guns.dmi b/icons/obj/weapons/guns/wide_guns.dmi index c05453c3c25..568a3bc051f 100644 Binary files a/icons/obj/weapons/guns/wide_guns.dmi and b/icons/obj/weapons/guns/wide_guns.dmi differ diff --git a/icons/turf/floors/grass_damaged.dmi b/icons/turf/floors/grass_damaged.dmi new file mode 100644 index 00000000000..73540b3ca6a Binary files /dev/null and b/icons/turf/floors/grass_damaged.dmi differ diff --git a/icons/turf/floors/grass_damaged.png b/icons/turf/floors/grass_damaged.png new file mode 100644 index 00000000000..4123f91cabe Binary files /dev/null and b/icons/turf/floors/grass_damaged.png differ diff --git a/icons/turf/floors/grass_damaged.png.toml b/icons/turf/floors/grass_damaged.png.toml new file mode 100644 index 00000000000..18341264515 --- /dev/null +++ b/icons/turf/floors/grass_damaged.png.toml @@ -0,0 +1,14 @@ +output_name = "grass_damaged" +template = "bitmask/diagonal_32x32.toml" + +[icon_size] +x = 50 +y = 50 + +[output_icon_size] +x = 50 +y = 50 + +[cut_pos] +x = 25 +y = 25 \ No newline at end of file diff --git a/interface/skin.dmf b/interface/skin.dmf index 42c2ba66060..7024e9ce4e4 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -97,6 +97,15 @@ window "mainwindow" anchor2 = -1,-1 is-visible = false saved-params = "" + elem "commandbar_spy" + type = BROWSER + is-default = false + pos = 0,0 + size = 200x200 + anchor1 = -1,-1 + anchor2 = -1,-1 + is-visible = false + saved-params = "" window "mapwindow" elem "mapwindow" diff --git a/modular_skyrat/master_files/code/datums/traits/neutral.dm b/modular_skyrat/master_files/code/datums/traits/neutral.dm index 2e66d536685..06e62a94578 100644 --- a/modular_skyrat/master_files/code/datums/traits/neutral.dm +++ b/modular_skyrat/master_files/code/datums/traits/neutral.dm @@ -229,13 +229,20 @@ GLOBAL_VAR_INIT(DNR_trait_overlay, generate_DNR_trait_overlay()) /datum/quirk/feline_aspect name = "Feline Traits" - desc = "You happen to act like a feline, for whatever reason." + desc = "You happen to act like a feline, for whatever reason. This will replace most other tongue-based speech quirks." gain_text = span_notice("Nya could go for some catnip right about now...") lose_text = span_notice("You feel less attracted to lasers.") medical_record_text = "Patient seems to possess behavior much like a feline." mob_trait = TRAIT_FELINE icon = FA_ICON_CAT +/datum/quirk/feline_aspect/add_unique(client/client_source) + var/mob/living/carbon/human/human_holder = quirk_holder + var/obj/item/organ/internal/tongue/cat/new_tongue = new(get_turf(human_holder)) + + new_tongue.copy_traits_from(human_holder.get_organ_slot(ORGAN_SLOT_TONGUE)) + new_tongue.Insert(human_holder, special = TRUE, movement_flags = DELETE_IF_REPLACED) + /datum/quirk/item_quirk/canine name = "Canidae Traits" desc = "Bark. You seem to act like a canine for whatever reason. This will replace most other tongue-based speech quirks." diff --git a/modular_skyrat/master_files/code/game/objects/items/stacks/sheets/sheet_types.dm b/modular_skyrat/master_files/code/game/objects/items/stacks/sheets/sheet_types.dm index c399c7272d5..42bfed06eaf 100644 --- a/modular_skyrat/master_files/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/modular_skyrat/master_files/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -21,23 +21,23 @@ // Iron GLOBAL_LIST_INIT(skyrat_metal_recipes, list( - new/datum/stack_recipe("wall mounted fire-safety closet", /obj/item/wallframe/firecloset, 2, time = 1.5 SECONDS, check_density = FALSE, category = CAT_FURNITURE), - new/datum/stack_recipe("wall mounted emergency closet", /obj/item/wallframe/emcloset, 2, time = 1.5 SECONDS, check_density = FALSE, category = CAT_FURNITURE), - new/datum/stack_recipe("wall mounted closet", /obj/item/wallframe/closet, 2, time = 1.5 SECONDS, check_density = FALSE, category = CAT_FURNITURE), - new/datum/stack_recipe("pool floor tile", /obj/item/stack/tile/iron/pool, 1, 4, 20, check_density = FALSE, category = CAT_TILES), - new/datum/stack_recipe("lowered floor tile", /obj/item/stack/tile/iron/lowered, 1, 4, 20, check_density = FALSE, category = CAT_TILES), - new/datum/stack_recipe("elevated floor tile", /obj/item/stack/tile/iron/elevated, 1, 4, 20, check_density = FALSE, category = CAT_TILES), - new/datum/stack_recipe("wrestling turnbuckle", /obj/structure/wrestling_corner, 3, time = 2.5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_STRUCTURE), - new/datum/stack_recipe("metal barricade", /obj/structure/deployable_barricade/metal, 2, time = 1 SECONDS, on_solid_ground = TRUE, check_direction = TRUE, category = CAT_STRUCTURE), - new/datum/stack_recipe("metal shelf", /obj/structure/rack/shelf, 1, time = 2 SECONDS, one_per_turf = TRUE, on_solid_ground = FALSE, category = CAT_STRUCTURE), - new/datum/stack_recipe("anvil", /obj/structure/reagent_anvil, 10, time = 2 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_TOOLS), - new/datum/stack_recipe("forge", /obj/structure/reagent_forge, 10, time = 2 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_TOOLS), - new/datum/stack_recipe("throwing wheel", /obj/structure/throwing_wheel, 10, time = 2 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_TOOLS), + new/datum/stack_recipe("wall mounted fire-safety closet", /obj/item/wallframe/firecloset, 2, time = 1.5 SECONDS, category = CAT_FURNITURE), + new/datum/stack_recipe("wall mounted emergency closet", /obj/item/wallframe/emcloset, 2, time = 1.5 SECONDS,category = CAT_FURNITURE), + new/datum/stack_recipe("wall mounted closet", /obj/item/wallframe/closet, 2, time = 1.5 SECONDS, category = CAT_FURNITURE), + new/datum/stack_recipe("pool floor tile", /obj/item/stack/tile/iron/pool, 1, 4, 20, category = CAT_TILES), + new/datum/stack_recipe("lowered floor tile", /obj/item/stack/tile/iron/lowered, 1, 4, 20, category = CAT_TILES), + new/datum/stack_recipe("elevated floor tile", /obj/item/stack/tile/iron/elevated, 1, 4, 20, category = CAT_TILES), + new/datum/stack_recipe("wrestling turnbuckle", /obj/structure/wrestling_corner, 3, time = 2.5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_STRUCTURE), + new/datum/stack_recipe("metal barricade", /obj/structure/deployable_barricade/metal, 2, time = 1 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND | CRAFT_CHECK_DIRECTION, category = CAT_STRUCTURE), + new/datum/stack_recipe("metal shelf", /obj/structure/rack/shelf, 1, time = 2 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_STRUCTURE), + new/datum/stack_recipe("anvil", /obj/structure/reagent_anvil, 10, time = 2 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_TOOLS), + new/datum/stack_recipe("forge", /obj/structure/reagent_forge, 10, time = 2 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_TOOLS), + new/datum/stack_recipe("throwing wheel", /obj/structure/throwing_wheel, 10, time = 2 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_TOOLS), )) GLOBAL_LIST_INIT(skyrat_metal_airlock_recipes, list( - new /datum/stack_recipe("corporate airlock assembly", /obj/structure/door_assembly/door_assembly_corporate, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), - new /datum/stack_recipe("service airlock assembly", /obj/structure/door_assembly/door_assembly_service, 4, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), + new /datum/stack_recipe("corporate airlock assembly", /obj/structure/door_assembly/door_assembly_corporate, 4, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), + new /datum/stack_recipe("service airlock assembly", /obj/structure/door_assembly/door_assembly_service, 4, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), )) /obj/item/stack/sheet/iron/get_main_recipes() @@ -48,7 +48,7 @@ GLOBAL_LIST_INIT(skyrat_metal_airlock_recipes, list( // Plasteel GLOBAL_LIST_INIT(skyrat_plasteel_recipes, list( - new/datum/stack_recipe("plasteel barricade", /obj/structure/deployable_barricade/metal/plasteel, 2, time = 1 SECONDS, on_solid_ground = TRUE, check_direction = TRUE, category = CAT_STRUCTURE), + new/datum/stack_recipe("plasteel barricade", /obj/structure/deployable_barricade/metal/plasteel, 2, time = 1 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND | CRAFT_CHECK_DIRECTION, category = CAT_STRUCTURE), )) /obj/item/stack/sheet/plasteel/get_main_recipes() @@ -58,10 +58,10 @@ GLOBAL_LIST_INIT(skyrat_plasteel_recipes, list( // Rods GLOBAL_LIST_INIT(skyrat_rod_recipes, list( - new/datum/stack_recipe("towel bin", /obj/structure/towel_bin/empty, 2, time = 0.5 SECONDS, one_per_turf = FALSE, check_density = FALSE, category = CAT_CONTAINERS), - new/datum/stack_recipe("guard rail", /obj/structure/deployable_barricade/guardrail, 2, time = 1 SECONDS, on_solid_ground = TRUE, check_direction = TRUE, category = CAT_STRUCTURE), - new/datum/stack_recipe("wrestling ropes", /obj/structure/railing/wrestling, 3, time = 1.8 SECONDS, on_solid_ground = TRUE, check_direction = TRUE, check_density = FALSE, category = CAT_STRUCTURE), - new/datum/stack_recipe("crutch", /obj/item/cane/crutch, 3, time = 10, one_per_turf = FALSE, category = CAT_TOOLS), + new/datum/stack_recipe("towel bin", /obj/structure/towel_bin/empty, 2, time = 0.5 SECONDS, crafting_flags = CRAFT_ONE_PER_TURF, category = CAT_CONTAINERS), + new/datum/stack_recipe("guard rail", /obj/structure/deployable_barricade/guardrail, 2, time = 1 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND | CRAFT_CHECK_DIRECTION, category = CAT_STRUCTURE), + new/datum/stack_recipe("wrestling ropes", /obj/structure/railing/wrestling, 3, time = 1.8 SECONDS, crafting_flags = CRAFT_ON_SOLID_GROUND | CRAFT_CHECK_DIRECTION, category = CAT_STRUCTURE), + new/datum/stack_recipe("crutch", /obj/item/cane/crutch, 3, time = 1 SECONDS, category = CAT_TOOLS), )) /obj/item/stack/rods/get_main_recipes() @@ -71,23 +71,24 @@ GLOBAL_LIST_INIT(skyrat_rod_recipes, list( // Wood GLOBAL_LIST_INIT(skyrat_wood_recipes, list( - new/datum/stack_recipe("water basin", /obj/structure/reagent_water_basin, 5, time = 2 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_TOOLS), - new/datum/stack_recipe("forging work bench", /obj/structure/reagent_crafting_bench, 5, time = 2 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_TOOLS), - new/datum/stack_recipe("wooden half-barricade", /obj/structure/deployable_barricade/wooden, 5, time = 2 SECONDS, on_solid_ground = TRUE, check_direction = TRUE, category = CAT_STRUCTURE), - new/datum/stack_recipe("sauna oven", /obj/structure/sauna_oven, 30, time = 1.5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_ENTERTAINMENT), - new/datum/stack_recipe("large wooden mortar", /obj/structure/large_mortar, 10, time = 3 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_TOOLS), - new/datum/stack_recipe("wooden cutting board", /obj/item/cutting_board, 5, time = 2 SECONDS, check_density = FALSE, category = CAT_TOOLS), - new/datum/stack_recipe("wooden shelf", /obj/structure/rack/wooden, 2, time = 2 SECONDS, one_per_turf = TRUE, on_solid_ground = FALSE, category = CAT_STRUCTURE), - new/datum/stack_recipe("seed shelf", /obj/machinery/smartfridge/wooden/seed_shelf, 10, time = 2 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_STRUCTURE), - new/datum/stack_recipe("produce bin", /obj/machinery/smartfridge/wooden/produce_bin, 10, time = 2 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_STRUCTURE), - new/datum/stack_recipe("produce display", /obj/machinery/smartfridge/wooden/produce_display, 10, time = 2 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_STRUCTURE), - new/datum/stack_recipe("ration shelf", /obj/machinery/smartfridge/wooden/ration_shelf, 10, time = 2 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_STRUCTURE), - new/datum/stack_recipe("storage barrel", /obj/structure/closet/crate/wooden/storage_barrel, 4, time = 2 SECONDS, one_per_turf = TRUE, on_solid_ground = FALSE, category = CAT_STRUCTURE), - new/datum/stack_recipe("worm barrel", /obj/structure/wormfarm, 5, time = 2 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_TOOLS), - new/datum/stack_recipe("gutlunch trough", /obj/structure/ore_container/gutlunch_trough, 5, time = 2 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_STRUCTURE), - new/datum/stack_recipe("sturdy wooden fence", /obj/structure/railing/wooden_fencing, 5, time = 2 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_TOOLS), - new/datum/stack_recipe("sturdy wooden fence gate", /obj/structure/railing/wooden_fencing/gate, 5, time = 2 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_TOOLS), - new/datum/stack_recipe("wooden bowl", /obj/item/reagent_containers/cup/bowl/wood_bowl, 3, time = 2 SECONDS, check_density = FALSE, category = CAT_TOOLS), + new/datum/stack_recipe("water basin", /obj/structure/reagent_water_basin, 5, time = 2 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_TOOLS), + new/datum/stack_recipe("forging work bench", /obj/structure/reagent_crafting_bench, 5, time = 2 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_TOOLS), + new/datum/stack_recipe("wooden half-barricade", /obj/structure/deployable_barricade/wooden, 5, time = 2 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND | CRAFT_CHECK_DIRECTION, category = CAT_STRUCTURE), + new/datum/stack_recipe("sauna oven", /obj/structure/sauna_oven, 30, time = 1.5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_ENTERTAINMENT), + new/datum/stack_recipe("large wooden mortar", /obj/structure/large_mortar, 10, time = 3 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_TOOLS), + new/datum/stack_recipe("wooden cutting board", /obj/item/cutting_board, 5, time = 2 SECONDS, category = CAT_TOOLS), + new/datum/stack_recipe("wooden shelf", /obj/structure/rack/wooden, 2, time = 2 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_STRUCTURE), + new/datum/stack_recipe("seed shelf", /obj/machinery/smartfridge/wooden/seed_shelf, 10, time = 2 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_STRUCTURE), + new/datum/stack_recipe("produce bin", /obj/machinery/smartfridge/wooden/produce_bin, 10, time = 2 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_STRUCTURE), + new/datum/stack_recipe("produce display", /obj/machinery/smartfridge/wooden/produce_display, 10, time = 2 SECONDS, crafting_flags = CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_STRUCTURE), + new/datum/stack_recipe("ration shelf", /obj/machinery/smartfridge/wooden/ration_shelf, 10, time = 2 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_STRUCTURE), + new/datum/stack_recipe("storage barrel", /obj/structure/closet/crate/wooden/storage_barrel, 4, time = 2 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_STRUCTURE), + new/datum/stack_recipe("worm barrel", /obj/structure/wormfarm, 5, time = 2 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_TOOLS), + new/datum/stack_recipe("gutlunch trough", /obj/structure/ore_container/gutlunch_trough, 5, time = 2 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_STRUCTURE), + new/datum/stack_recipe("sturdy wooden fence", /obj/structure/railing/wooden_fencing, 5, time = 2 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_STRUCTURE), + new/datum/stack_recipe("sturdy wooden fence gate", /obj/structure/railing/wooden_fencing/gate, 5, time = 2 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_STRUCTURE), + new/datum/stack_recipe("large wooden gate", /obj/structure/mineral_door/wood/large_gate, 10, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_STRUCTURE), + new/datum/stack_recipe("wooden bowl", /obj/item/reagent_containers/cup/bowl/wood_bowl, 3, time = 2 SECONDS, category = CAT_TOOLS), )) @@ -98,11 +99,11 @@ GLOBAL_LIST_INIT(skyrat_wood_recipes, list( // Cloth GLOBAL_LIST_INIT(skyrat_cloth_recipes, list( - new/datum/stack_recipe("fancy pillow", /obj/item/fancy_pillow, 3, check_density = FALSE, category = CAT_ENTERTAINMENT), - new/datum/stack_recipe("towel", /obj/item/towel, 2, check_density = FALSE, category = CAT_CLOTHING), - new/datum/stack_recipe("eyepatch wrap", /obj/item/clothing/glasses/eyepatch/wrap, 2, check_density = FALSE, category = CAT_CLOTHING), - new/datum/stack_recipe("eyepatch", /obj/item/clothing/glasses/eyepatch, 2, check_density = FALSE, category = CAT_CLOTHING), - new/datum/stack_recipe("xenoarch bag", /obj/item/storage/bag/xenoarch, 4, check_density = FALSE, category = CAT_CONTAINERS), + new/datum/stack_recipe("fancy pillow", /obj/item/fancy_pillow, 3, category = CAT_ENTERTAINMENT), + new/datum/stack_recipe("towel", /obj/item/towel, 2, category = CAT_CLOTHING), + new/datum/stack_recipe("eyepatch wrap", /obj/item/clothing/glasses/eyepatch/wrap, 2, category = CAT_CLOTHING), + new/datum/stack_recipe("eyepatch", /obj/item/clothing/glasses/eyepatch, 2, category = CAT_CLOTHING), + new/datum/stack_recipe("xenoarch bag", /obj/item/storage/bag/xenoarch, 4, category = CAT_CONTAINERS), )) /obj/item/stack/sheet/cloth/get_main_recipes() @@ -115,10 +116,10 @@ GLOBAL_LIST_INIT(skyrat_leather_recipes, list( )) GLOBAL_LIST_INIT(skyrat_leather_belt_recipes, list( - new/datum/stack_recipe("xenoarch belt", /obj/item/storage/belt/utility/xenoarch, 4, check_density = FALSE, category = CAT_CONTAINERS), - new/datum/stack_recipe("medical bandolier", /obj/item/storage/belt/medbandolier, 5, check_density = FALSE, category = CAT_CONTAINERS), - new/datum/stack_recipe("gear harness", /obj/item/clothing/under/misc/skyrat/gear_harness, 6, check_density = FALSE, category = CAT_CLOTHING), - new/datum/stack_recipe("ammo pouch", /obj/item/storage/pouch/ammo, 4, check_density = FALSE, category = CAT_CONTAINERS), + new/datum/stack_recipe("xenoarch belt", /obj/item/storage/belt/utility/xenoarch, 4, category = CAT_CONTAINERS), + new/datum/stack_recipe("medical bandolier", /obj/item/storage/belt/medbandolier, 5, category = CAT_CONTAINERS), + new/datum/stack_recipe("gear harness", /obj/item/clothing/under/misc/skyrat/gear_harness, 6, category = CAT_CLOTHING), + new/datum/stack_recipe("ammo pouch", /obj/item/storage/pouch/ammo, 4, category = CAT_CONTAINERS), )) /obj/item/stack/sheet/leather/get_main_recipes() @@ -129,7 +130,7 @@ GLOBAL_LIST_INIT(skyrat_leather_belt_recipes, list( // Titanium GLOBAL_LIST_INIT(skyrat_titanium_recipes, list( - new/datum/stack_recipe("spaceship plating", /obj/item/stack/sheet/spaceship, 1, time = 5, check_density = FALSE, category = CAT_MISC), + new/datum/stack_recipe("spaceship plating", /obj/item/stack/sheet/spaceship, 1, time = 5, category = CAT_MISC), )) /obj/item/stack/sheet/mineral/titanium/get_main_recipes() @@ -139,7 +140,7 @@ GLOBAL_LIST_INIT(skyrat_titanium_recipes, list( // Snow GLOBAL_LIST_INIT(skyrat_snow_recipes, list( - new/datum/stack_recipe("snow barricade", /obj/structure/deployable_barricade/snow, 2, on_solid_ground = TRUE, check_direction = TRUE, category = CAT_STRUCTURE), + new/datum/stack_recipe("snow barricade", /obj/structure/deployable_barricade/snow, 2, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND | CRAFT_CHECK_DIRECTION, category = CAT_STRUCTURE), )) /obj/item/stack/sheet/mineral/snow/get_main_recipes() @@ -149,7 +150,7 @@ GLOBAL_LIST_INIT(skyrat_snow_recipes, list( // Sand GLOBAL_LIST_INIT(skyrat_sand_recipes, list( - new/datum/stack_recipe("ant farm", /obj/structure/antfarm, 20, time = 2 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_TOOLS), + new/datum/stack_recipe("ant farm", /obj/structure/antfarm, 20, time = 2 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_TOOLS), )) /obj/item/stack/ore/glass/get_main_recipes() diff --git a/modular_skyrat/master_files/code/modules/clothing/clothing_variation_overrides/suit.dm b/modular_skyrat/master_files/code/modules/clothing/clothing_variation_overrides/suit.dm index 26b6d64a6cc..f72389e4778 100644 --- a/modular_skyrat/master_files/code/modules/clothing/clothing_variation_overrides/suit.dm +++ b/modular_skyrat/master_files/code/modules/clothing/clothing_variation_overrides/suit.dm @@ -53,6 +53,18 @@ /obj/item/clothing/suit/jacket/curator supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON +/obj/item/clothing/suit/costume/wellworn_shirt + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON + gets_cropped_on_taurs = FALSE + +/obj/item/clothing/suit/jacket/oversized + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON + gets_cropped_on_taurs = FALSE + +/obj/item/clothing/suit/mothcoat/winter + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON + gets_cropped_on_taurs = FALSE + //Chaplain Suits /obj/item/clothing/suit/hooded/chaplain_hoodie supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON diff --git a/modular_skyrat/master_files/code/modules/clothing/suits/labcoat.dm b/modular_skyrat/master_files/code/modules/clothing/suits/labcoat.dm index b6ebd71dbd0..785236aeef9 100644 --- a/modular_skyrat/master_files/code/modules/clothing/suits/labcoat.dm +++ b/modular_skyrat/master_files/code/modules/clothing/suits/labcoat.dm @@ -12,6 +12,7 @@ name = "research directors labcoat" desc = "A Nanotrasen standard labcoat for certified Research Directors. It has an extra plastic-latex lining on the outside for more protection from chemical and viral hazards." icon_state = "labcoat_rd" + gets_cropped_on_taurs = FALSE body_parts_covered = CHEST|ARMS|LEGS armor_type = /datum/armor/skyrat_rd @@ -21,6 +22,18 @@ fire = 80 acid = 70 +/obj/item/clothing/suit/toggle/labcoat/skyrat/regular + name = "researcher's labcoat" + desc = "A Nanotrasen standard labcoat for researchers in the scientific field." + icon_state = "labcoat_regular" + gets_cropped_on_taurs = FALSE + +/obj/item/clothing/suit/toggle/labcoat/skyrat/pharmacist + name = "pharmacist's labcoat" + desc = "A standard labcoat for chemistry which protects the wearer from acid spills." + icon_state = "labcoat_pharm" + gets_cropped_on_taurs = FALSE + /obj/item/clothing/suit/toggle/labcoat/skyrat/highvis name = "high vis labcoat" desc = "A high visibility vest for emergency responders, intended to draw attention away from the blood." diff --git a/modular_skyrat/master_files/code/modules/clothing/under/jobs/security.dm b/modular_skyrat/master_files/code/modules/clothing/under/jobs/security.dm index 51af7f0675e..4a9b047d963 100644 --- a/modular_skyrat/master_files/code/modules/clothing/under/jobs/security.dm +++ b/modular_skyrat/master_files/code/modules/clothing/under/jobs/security.dm @@ -1,5 +1,5 @@ /obj/item/clothing/under/rank/security - worn_icon_digi = 'modular_skyrat/master_files/icons/mob/clothing/under/security_digi.dmi' // Anything that was in the security.dmi, should be in the security_digi.dmi + worn_icon_digi = 'modular_skyrat/master_files/icons/mob/clothing/under/security_digi.dmi' /obj/item/clothing/under/rank/security/skyrat icon = 'modular_skyrat/master_files/icons/obj/clothing/under/security.dmi' @@ -32,6 +32,15 @@ armor_type = /datum/armor/clothing_under/redsec_syndicate has_sensor = NO_SENSORS +/obj/item/clothing/under/rank/security/peacekeeper/skirt + name = "security battle dress" + desc = "An asymmetrical, unisex uniform with the legs replaced by a utility skirt." + worn_icon_state = "security_skirt" + icon_state = "security_skirt" + uses_advanced_reskins = FALSE + unique_reskin = null + alt_covers_chest = FALSE + /obj/item/clothing/under/rank/security/peacekeeper/trousers name = "security trousers" desc = "Some Peacekeeper-blue combat trousers. Probably should pair it with a vest for safety." @@ -40,7 +49,99 @@ icon_state = "workpants_blue" body_parts_covered = GROIN|LEGS can_adjust = FALSE + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION female_sprite_flags = FEMALE_UNIFORM_NO_BREASTS + uses_advanced_reskins = TRUE + unique_reskin = list( + "Blue Variant" = list( + RESKIN_ICON_STATE = "workpants_blue", + RESKIN_WORN_ICON_STATE = "workpants_blue" + ), + "White Variant" = list( + RESKIN_ICON_STATE = "workpants_white", + RESKIN_WORN_ICON_STATE = "workpants_white" + ), + ) + +/obj/item/clothing/under/rank/security/peacekeeper/trousers/shorts + name = "security shorts" + desc = "Some Peacekeeper-blue combat shorts. Definitely should pair it with a vest for safety." + icon_state = "workshorts_blue" + uses_advanced_reskins = TRUE + unique_reskin = list( + "Blue Variant, Short" = list( + RESKIN_ICON_STATE = "workshorts_blue", + RESKIN_WORN_ICON_STATE = "workshorts_blue" + ), + "Blue Variant, Short Short" = list( + RESKIN_ICON_STATE = "workshorts_blue_short", + RESKIN_WORN_ICON_STATE = "workshorts_blue_short" + ), + "White Variant, Short" = list( + RESKIN_ICON_STATE = "workshorts_white", + RESKIN_WORN_ICON_STATE = "workshorts_white" + ), + "White Variant, Short Short" = list( + RESKIN_ICON_STATE = "workshorts_white_short", + RESKIN_WORN_ICON_STATE = "workshorts_white_short" + ), + ) + +/obj/item/clothing/under/rank/security/peacekeeper/jumpsuit + name = "security jumpsuit" + desc = "Turtleneck sweater commonly worn by Peacekeepers, attached with pants." + icon_state = "jumpsuit_blue" + can_adjust = TRUE + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION + female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY + +/obj/item/clothing/under/rank/security/officer/skirt + name = "security jumpskirt" + desc = "Turtleneck sweater commonly worn by Peacekeepers, attached with a skirt." + icon = 'modular_skyrat/master_files/icons/obj/clothing/under/security.dmi' + worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/under/security.dmi' + icon_state = "jumpskirt_blue" + female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY + gets_cropped_on_taurs = FALSE + uses_advanced_reskins = TRUE + unique_reskin = list( + "Blue Variant" = list( + RESKIN_ICON_STATE = "jumpskirt_blue", + RESKIN_WORN_ICON_STATE = "jumpskirt_blue" + ), + "Black Variant" = list( + RESKIN_ICON_STATE = "jumpskirt_black", + RESKIN_WORN_ICON_STATE = "jumpskirt_black" + ), + ) + +/obj/item/clothing/under/rank/security/peacekeeper/shortskirt + name = "security shortskirt" + desc = "Plainshirted uniform commonly worn by Peacekeepers, attached with a skirt." + icon_state = "shortskirt_blue" + icon = 'modular_skyrat/master_files/icons/obj/clothing/under/security.dmi' + worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/under/security.dmi' + female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY + gets_cropped_on_taurs = FALSE + uses_advanced_reskins = TRUE + unique_reskin = list( + "Blue Variant" = list( + RESKIN_ICON_STATE = "shortskirt_blue", + RESKIN_WORN_ICON_STATE = "shortskirt_blue" + ), + "Black Variant" = list( + RESKIN_ICON_STATE = "shortskirt_black", + RESKIN_WORN_ICON_STATE = "shortskirt_black" + ), + ) + +/obj/item/clothing/under/rank/security/peacekeeper/miniskirt + name = "security miniskirt" + desc = "This miniskirt was originally featured in a gag calendar, but entered official use once they realized its potential for arid climates." + icon_state = "miniskirt" + female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY + gets_cropped_on_taurs = FALSE + can_adjust = TRUE /* * HEAD OF SECURITY diff --git a/modular_skyrat/master_files/code/modules/jobs/job_types/roboticist.dm b/modular_skyrat/master_files/code/modules/jobs/job_types/roboticist.dm index a2b0767ce97..f59c65f3365 100644 --- a/modular_skyrat/master_files/code/modules/jobs/job_types/roboticist.dm +++ b/modular_skyrat/master_files/code/modules/jobs/job_types/roboticist.dm @@ -7,7 +7,7 @@ glasses = /obj/item/clothing/glasses/hud/diagnostic gloves = /obj/item/clothing/gloves/color/black - l_hand = /obj/item/storage/medkit/mechanical/roboticist + l_hand = /obj/item/storage/medkit/robotic_repair/preemo/stocked /datum/job/roboticist description = "Build cyborgs, mechs, AIs, and maintain them all. Create MODsuits for those that wish. Try to remind medical that you're \ diff --git a/modular_skyrat/master_files/icons/mob/clothing/suits/labcoat.dmi b/modular_skyrat/master_files/icons/mob/clothing/suits/labcoat.dmi index ecf0f2de15c..ac9fe47496a 100644 Binary files a/modular_skyrat/master_files/icons/mob/clothing/suits/labcoat.dmi and b/modular_skyrat/master_files/icons/mob/clothing/suits/labcoat.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/clothing/under/security.dmi b/modular_skyrat/master_files/icons/mob/clothing/under/security.dmi index 0aeace1f82e..9b766d06864 100644 Binary files a/modular_skyrat/master_files/icons/mob/clothing/under/security.dmi and b/modular_skyrat/master_files/icons/mob/clothing/under/security.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/sprite_accessory/taur.dmi b/modular_skyrat/master_files/icons/mob/sprite_accessory/taur.dmi index 66064739c0c..6b943d10005 100644 Binary files a/modular_skyrat/master_files/icons/mob/sprite_accessory/taur.dmi and b/modular_skyrat/master_files/icons/mob/sprite_accessory/taur.dmi differ diff --git a/modular_skyrat/master_files/icons/mob/sprite_accessory/wings.dmi b/modular_skyrat/master_files/icons/mob/sprite_accessory/wings.dmi index 16070100737..c8777b833ff 100644 Binary files a/modular_skyrat/master_files/icons/mob/sprite_accessory/wings.dmi and b/modular_skyrat/master_files/icons/mob/sprite_accessory/wings.dmi differ diff --git a/modular_skyrat/master_files/icons/obj/clothing/suits/labcoat.dmi b/modular_skyrat/master_files/icons/obj/clothing/suits/labcoat.dmi index c63b241a799..abe9f39089b 100644 Binary files a/modular_skyrat/master_files/icons/obj/clothing/suits/labcoat.dmi and b/modular_skyrat/master_files/icons/obj/clothing/suits/labcoat.dmi differ diff --git a/modular_skyrat/master_files/icons/obj/clothing/under/security.dmi b/modular_skyrat/master_files/icons/obj/clothing/under/security.dmi index ac3891c27c1..129201a0373 100644 Binary files a/modular_skyrat/master_files/icons/obj/clothing/under/security.dmi and b/modular_skyrat/master_files/icons/obj/clothing/under/security.dmi differ diff --git a/modular_skyrat/modules/ashwalkers/code/clothing/ash_armour.dm b/modular_skyrat/modules/ashwalkers/code/clothing/ash_armour.dm index 0d2b66232c6..87ac2d720d4 100644 --- a/modular_skyrat/modules/ashwalkers/code/clothing/ash_armour.dm +++ b/modular_skyrat/modules/ashwalkers/code/clothing/ash_armour.dm @@ -50,6 +50,8 @@ name = "Ash Headdress" result = /obj/item/clothing/head/ash_headdress category = CAT_CLOTHING + //recipe given to ashwalkers as part of their spawner/team setting + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED /obj/item/clothing/head/ash_headdress/Initialize(mapload) . = ..() @@ -62,6 +64,7 @@ /datum/crafting_recipe/ash_recipe/ash_headdress/winged name = "Winged Ash Headdress" result = /obj/item/clothing/head/ash_headdress/winged + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED /obj/item/clothing/under/costume/gladiator/ash_walker/ash_robes name = "ash robes" @@ -81,6 +84,7 @@ name = "Ash Robes" result = /obj/item/clothing/under/costume/gladiator/ash_walker/ash_robes category = CAT_CLOTHING + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED /obj/item/clothing/under/costume/gladiator/ash_walker/ash_robes/Initialize(mapload) . = ..() @@ -105,6 +109,7 @@ name = "Ash Combat Plates" result = /obj/item/clothing/under/costume/gladiator/ash_walker/ash_plates category = CAT_CLOTHING + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED /obj/item/clothing/under/costume/gladiator/ash_walker/ash_plates/Initialize(mapload) . = ..() @@ -118,6 +123,7 @@ name = "Decorated Ash Combat Plates" result = /obj/item/clothing/under/costume/gladiator/ash_walker/ash_plates/decorated category = CAT_CLOTHING + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED /obj/item/clothing/shoes/bone_greaves name = "bone greaves" diff --git a/modular_skyrat/modules/ashwalkers/code/items/ash_weapon.dm b/modular_skyrat/modules/ashwalkers/code/items/ash_weapon.dm index 5dd1409c714..64b95f7099a 100644 --- a/modular_skyrat/modules/ashwalkers/code/items/ash_weapon.dm +++ b/modular_skyrat/modules/ashwalkers/code/items/ash_weapon.dm @@ -25,7 +25,7 @@ /obj/item/stack/sheet/sinew = 2, /obj/item/stack/sheet/animalhide/goliath_hide = 2, ) - always_available = FALSE + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED category = CAT_WEAPON_MELEE /obj/item/kinetic_crusher/cursed diff --git a/modular_skyrat/modules/colony_fabricator/code/construction/turfs.dm b/modular_skyrat/modules/colony_fabricator/code/construction/turfs.dm index bb448818235..8294a3c4091 100644 --- a/modular_skyrat/modules/colony_fabricator/code/construction/turfs.dm +++ b/modular_skyrat/modules/colony_fabricator/code/construction/turfs.dm @@ -15,8 +15,8 @@ sheet_amount = 1 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/fulltile/colony_fabricator, time = 1 SECONDS, on_solid_ground = TRUE, check_direction = TRUE, is_fulltile = TRUE, category = CAT_WINDOWS), \ + new/datum/stack_recipe("prefabricated wall", /turf/closed/wall/prefab_plastic, time = 3 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("prefabricated window", /obj/structure/window/fulltile/colony_fabricator, time = 1 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND | CRAFT_CHECK_DIRECTION | CRAFT_IS_FULLTILE, category = CAT_WINDOWS), \ )) /obj/item/stack/sheet/plastic_wall_panel diff --git a/modular_skyrat/modules/company_imports/code/armament_datums/deforest_medical.dm b/modular_skyrat/modules/company_imports/code/armament_datums/deforest_medical.dm index 99020d9e985..8e95c9a9b42 100644 --- a/modular_skyrat/modules/company_imports/code/armament_datums/deforest_medical.dm +++ b/modular_skyrat/modules/company_imports/code/armament_datums/deforest_medical.dm @@ -19,6 +19,14 @@ item_type = /obj/item/storage/medkit/combat_surgeon/stocked cost = PAYCHECK_COMMAND * 3.5 +/datum/armament_entry/company_import/deforest/first_aid_kit/robo_repair + item_type = /obj/item/storage/medkit/robotic_repair/stocked + cost = PAYCHECK_COMMAND * 3.5 + +/datum/armament_entry/company_import/deforest/first_aid_kit/robo_repair_super + item_type = /obj/item/storage/medkit/robotic_repair/preemo/stocked + cost = PAYCHECK_COMMAND * 8 + /datum/armament_entry/company_import/deforest/first_aid_kit/first_responder item_type = /obj/item/storage/backpack/duffelbag/deforest_surgical/stocked cost = PAYCHECK_COMMAND * 6 @@ -64,6 +72,14 @@ item_type = /obj/item/storage/pill_bottle/painkiller cost = PAYCHECK_CREW +/datum/armament_entry/company_import/deforest/first_aid/robo_patch + item_type = /obj/item/reagent_containers/pill/robotic_patch/synth_repair + cost = PAYCHECK_CREW + +/datum/armament_entry/company_import/deforest/first_aid/bandaid + item_type = /obj/item/storage/box/bandages + cost = PAYCHECK_CREW * 1.5 + /datum/armament_entry/company_import/deforest/first_aid/subdermal_splint item_type = /obj/item/stack/medical/wound_recovery cost = PAYCHECK_COMMAND * 2 @@ -72,6 +88,14 @@ item_type = /obj/item/stack/medical/wound_recovery/rapid_coagulant cost = PAYCHECK_COMMAND * 2 +/datum/armament_entry/company_import/deforest/first_aid/robofoam + item_type = /obj/item/stack/medical/wound_recovery/robofoam + cost = PAYCHECK_COMMAND * 2 + +/datum/armament_entry/company_import/deforest/first_aid/super_robofoam + item_type = /obj/item/stack/medical/wound_recovery/robofoam_super + cost = PAYCHECK_COMMAND * 4 + // Autoinjectors for healing /datum/armament_entry/company_import/deforest/medpens @@ -105,6 +129,12 @@ /datum/armament_entry/company_import/deforest/medpens/halobinin item_type = /obj/item/reagent_containers/hypospray/medipen/deforest/halobinin +/datum/armament_entry/company_import/deforest/medpens/robo_solder + item_type = /obj/item/reagent_containers/hypospray/medipen/deforest/robot_liquid_solder + +/datum/armament_entry/company_import/deforest/medpens/robo_cleaner + item_type = /obj/item/reagent_containers/hypospray/medipen/deforest/robot_system_cleaner + /datum/armament_entry/company_import/deforest/medpens/pentibinin item_type = /obj/item/reagent_containers/hypospray/medipen/deforest/pentibinin contraband = TRUE @@ -194,7 +224,7 @@ BUBBER EDIT END*/ /datum/armament_entry/company_import/deforest/equipment/medigun_upgrade item_type = /obj/item/device/custom_kit/medigun_fastcharge cost = PAYCHECK_COMMAND * 2 - + /datum/armament_entry/company_import/deforest/equipment/hypospray_upgrade item_type = /obj/item/device/custom_kit/deluxe_hypo2 cost = PAYCHECK_COMMAND * 2 diff --git a/modular_skyrat/modules/customization/modules/clothing/suits/hoodies.dm b/modular_skyrat/modules/customization/modules/clothing/suits/hoodies.dm index ec41c2c3eb3..fa2015a62cd 100644 --- a/modular_skyrat/modules/customization/modules/clothing/suits/hoodies.dm +++ b/modular_skyrat/modules/customization/modules/clothing/suits/hoodies.dm @@ -13,6 +13,7 @@ greyscale_colors = "#FFFFFF" flags_1 = IS_PLAYER_COLORABLE_1 supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON + gets_cropped_on_taurs = FALSE min_cold_protection_temperature = T0C - 20 //Not as good as the base jacket /obj/item/clothing/suit/toggle/jacket/hoodie/trim diff --git a/modular_skyrat/modules/customization/modules/clothing/suits/misc.dm b/modular_skyrat/modules/customization/modules/clothing/suits/misc.dm index ad488df4e86..e3705379e81 100644 --- a/modular_skyrat/modules/customization/modules/clothing/suits/misc.dm +++ b/modular_skyrat/modules/customization/modules/clothing/suits/misc.dm @@ -15,6 +15,7 @@ worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/suit.dmi' icon_state = "dutchjacket" supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON + gets_cropped_on_taurs = FALSE /obj/item/clothing/suit/toggle/trackjacket @@ -295,6 +296,7 @@ worn_icon_teshari = 'modular_skyrat/modules/GAGS/icons/suit/suit_teshari.dmi' icon_state = "apron" supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON + gets_cropped_on_taurs = FALSE greyscale_colors = "#ffffff" greyscale_config = /datum/greyscale_config/apron greyscale_config_worn = /datum/greyscale_config/apron/worn @@ -337,6 +339,7 @@ greyscale_colors = "#867361" flags_1 = IS_PLAYER_COLORABLE_1 supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON + gets_cropped_on_taurs = FALSE /obj/item/clothing/suit/heart_sweater name = "heart sweater" @@ -347,3 +350,4 @@ greyscale_colors = "#867361#8f3a3a" flags_1 = IS_PLAYER_COLORABLE_1 supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON + gets_cropped_on_taurs = FALSE diff --git a/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories/taur_types.dm b/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories/taur_types.dm index c52af4de049..7944dc08604 100644 --- a/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories/taur_types.dm +++ b/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories/taur_types.dm @@ -154,3 +154,20 @@ icon_state = "slime" taur_mode = STYLE_TAUR_SNAKE color_src = USE_ONE_COLOR + +/datum/sprite_accessory/taur/biglegs + name = "Big Legs" + icon_state = "biglegs" + taur_mode = STYLE_TAUR_PAW + +/datum/sprite_accessory/taur/biglegs/stanced + name = "Big Legs, Stanced" + icon_state = "biglegs_stanced" + +/datum/sprite_accessory/taur/biglegs/bird + name = "Big Legs, Bird" + icon_state = "biglegs_bird" + +/datum/sprite_accessory/taur/biglegs/stanced/bird + name = "Big Legs, Stanced Bird" + icon_state = "biglegs_bird_stanced" 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 bb3dbf1c8fe..31c31336065 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 @@ -22,6 +22,8 @@ amount = 3 merge_type = /obj/item/stack/medical/wound_recovery custom_price = PAYCHECK_COMMAND * 2.5 + /// If this checks for pain, used for synthetic repair foam + var/causes_pain = TRUE /// The types of wounds that we work on, in list format var/list/applicable_wounds = list( /datum/wound/blunt/bone, @@ -70,10 +72,10 @@ if(!do_after(user, treatment_delay, target = patient)) return - user.visible_message(span_green("[user] applies [src] to [patient]'s [limb.plaintext_zone]."), span_green("You bandage the wounds on [user == patient ? "your" : "[patient]'s"] [limb.plaintext_zone].")) + user.visible_message(span_green("[user] applies [src] to [patient]'s [limb.plaintext_zone]."), span_green("You treat the wounds on [user == patient ? "your" : "[patient]'s"] [limb.plaintext_zone].")) playsound(patient, treatment_sound, 50, TRUE) woundies.remove_wound() - if(!HAS_TRAIT(patient, TRAIT_ANALGESIA)) + if(!HAS_TRAIT(patient, TRAIT_ANALGESIA) || !causes_pain) patient.emote("scream") to_chat(patient, span_userdanger("Your [limb.plaintext_zone] burns like hell as the wounds on it are rapidly healed, fuck!")) patient.add_mood_event("severe_surgery", /datum/mood_event/rapid_wound_healing) @@ -83,7 +85,7 @@ use(1) /datum/mood_event/rapid_wound_healing - description = "That may have healed my wound fast, but if that wasn't one of the worst experiences!\n" + description = "The wound is gone, but that pain was unbearable!\n" mood_change = -3 timeout = 5 MINUTES diff --git a/modular_skyrat/modules/deforest_medical_items/code/injectors.dm b/modular_skyrat/modules/deforest_medical_items/code/injectors.dm index 2f837c709f7..6201b93a6fe 100644 --- a/modular_skyrat/modules/deforest_medical_items/code/injectors.dm +++ b/modular_skyrat/modules/deforest_medical_items/code/injectors.dm @@ -207,3 +207,25 @@ /datum/reagent/medicine/higadrite = 5, /datum/reagent/medicine/silibinin = 5, ) + +// Medpen for robots that fixes toxin damage and purges synth chems but slows them down for a bit +/obj/item/reagent_containers/hypospray/medipen/deforest/robot_system_cleaner + name = "synthetic cleaner autoinjector" + desc = "A Deforest branded autoinjector, loaded with system cleaner for purging synthetics of reagents." + base_icon_state = "robor" + icon_state = "robor" + list_reagents = list( + /datum/reagent/medicine/system_cleaner = 15, + /datum/reagent/dinitrogen_plasmide = 5, + ) + +// Medpen for robots that fixes brain damage but slows them down for a bit +/obj/item/reagent_containers/hypospray/medipen/deforest/robot_liquid_solder + name = "synthetic smart-solder autoinjector" + desc = "A Deforest branded autoinjector, loaded with liquid solder to repair synthetic processor core damage." + base_icon_state = "robor_brain" + icon_state = "robor_brain" + list_reagents = list( + /datum/reagent/medicine/liquid_solder = 15, + /datum/reagent/dinitrogen_plasmide = 5, + ) diff --git a/modular_skyrat/modules/deforest_medical_items/code/medstation_designs/medical.dm b/modular_skyrat/modules/deforest_medical_items/code/medstation_designs/medical.dm index 7eb8106e3a4..2249061cc15 100644 --- a/modular_skyrat/modules/deforest_medical_items/code/medstation_designs/medical.dm +++ b/modular_skyrat/modules/deforest_medical_items/code/medstation_designs/medical.dm @@ -75,6 +75,28 @@ RND_CATEGORY_DEFOREST_MEDICAL, ) +/datum/design/organic_printer_synth_patch + name = "Robotic Repair Patch" + id = "organic_repair_patch" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 100) + build_path = /obj/item/reagent_containers/pill/robotic_patch/synth_repair + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_DEFOREST_MEDICAL, + ) + +/datum/design/organic_printer_repair_foam + name = "Robotic Repair Spray" + id = "organic_repair_foam" + build_type = BIOGENERATOR + materials = list(/datum/material/biomass = 100) + build_path = /obj/item/stack/sticky_tape/surgical + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_DEFOREST_MEDICAL, + ) + /datum/design/organic_printer_bone_gel name = "Bone Gel" id = "organic_bone_gel" diff --git a/modular_skyrat/modules/deforest_medical_items/code/storage_items_robotics.dm b/modular_skyrat/modules/deforest_medical_items/code/storage_items_robotics.dm new file mode 100644 index 00000000000..5b11803d1e7 --- /dev/null +++ b/modular_skyrat/modules/deforest_medical_items/code/storage_items_robotics.dm @@ -0,0 +1,76 @@ +// Pre-packed medkit for healing synths and repairing their wounds rapidly in the field +/obj/item/storage/medkit/robotic_repair + name = "robotic repair equipment kit" + desc = "An industrial-strength plastic box filled with supplies for repairing synthetics from critical damage." + icon = 'modular_skyrat/modules/deforest_medical_items/icons/storage.dmi' + icon_state = "synth_medkit" + inhand_icon_state = "medkit" + worn_icon = 'modular_skyrat/modules/deforest_medical_items/icons/worn/worn.dmi' + worn_icon_teshari = 'modular_skyrat/modules/deforest_medical_items/icons/worn/worn_teshari.dmi' + worn_icon_state = "frontier" + drop_sound = 'sound/items/handling/ammobox_drop.ogg' + pickup_sound = 'sound/items/handling/ammobox_pickup.ogg' + +/obj/item/storage/medkit/robotic_repair/Initialize(mapload) + . = ..() + var/static/list/list_of_everything_mechanical_medkits_can_hold = list_of_everything_medkits_can_hold + list( + /obj/item/stack/cable_coil, + /obj/item/crowbar, + /obj/item/screwdriver, + /obj/item/wrench, + /obj/item/weldingtool, + /obj/item/wirecutters, + /obj/item/multitool, + /obj/item/plunger, + /obj/item/clothing/head/utility/welding, + /obj/item/clothing/glasses/welding, + ) + var/static/list/exception_cache = typecacheof( + /obj/item/clothing/head/utility/welding, + ) + + atom_storage.set_holdable(list_of_everything_mechanical_medkits_can_hold) + LAZYINITLIST(atom_storage.exception_hold) + atom_storage.exception_hold = atom_storage.exception_hold + exception_cache + atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL + +/obj/item/storage/medkit/robotic_repair/stocked + +/obj/item/storage/medkit/robotic_repair/stocked/PopulateContents() + var/static/items_inside = list( + /obj/item/stack/medical/gauze = 1, + /obj/item/reagent_containers/pill/robotic_patch/synth_repair = 2, + /obj/item/stack/medical/wound_recovery/robofoam = 1, + /obj/item/reagent_containers/hypospray/medipen/deforest/robot_system_cleaner = 1, + /obj/item/reagent_containers/hypospray/medipen/deforest/coagulants = 1, // Coagulants help electrical damage + /obj/item/healthanalyzer/simple = 1, + ) + generate_items_inside(items_inside,src) + +/obj/item/storage/medkit/robotic_repair/preemo + name = "premium robotic repair equipment kit" + desc = "An industrial-strength plastic box filled with supplies for repairing synthetics from critical damage. \ + This one has extra storage on the sides for even more equipment than the standard medkit model." + icon_state = "synth_medkit_super" + +/obj/item/storage/medkit/robotic_repair/preemo/Initialize(mapload) + . = ..() + atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL + atom_storage.max_slots = 12 + atom_storage.max_total_storage = 12 * WEIGHT_CLASS_NORMAL + +/obj/item/storage/medkit/robotic_repair/preemo/stocked + +/obj/item/storage/medkit/robotic_repair/preemo/stocked/PopulateContents() + var/static/items_inside = list( + /obj/item/stack/medical/gauze/twelve = 1, + /obj/item/stack/cable_coil/thirty = 1, + /obj/item/reagent_containers/pill/robotic_patch/synth_repair = 4, + /obj/item/stack/medical/wound_recovery/robofoam = 1, + /obj/item/stack/medical/wound_recovery/robofoam_super = 1, + /obj/item/reagent_containers/hypospray/medipen/deforest/robot_system_cleaner = 1, + /obj/item/reagent_containers/hypospray/medipen/deforest/robot_liquid_solder = 1, + /obj/item/reagent_containers/hypospray/medipen/deforest/coagulants = 1, + /obj/item/healthanalyzer/simple = 1, + ) + generate_items_inside(items_inside,src) diff --git a/modular_skyrat/modules/deforest_medical_items/code/synth_healing.dm b/modular_skyrat/modules/deforest_medical_items/code/synth_healing.dm new file mode 100644 index 00000000000..e8623992e61 --- /dev/null +++ b/modular_skyrat/modules/deforest_medical_items/code/synth_healing.dm @@ -0,0 +1,104 @@ +// Used to stop synth structural damage +/obj/item/stack/medical/wound_recovery/robofoam + name = "robotic repair spray" + singular_name = "robotic repair spray" + desc = "A needle-tip foam gun filled with an advanced synthetic foam that rapidly \ + fills and stabilizes structural damage in synthetics. The damaged area will be \ + vulnerable to further damage while the foam hardens" + icon = 'modular_skyrat/modules/deforest_medical_items/icons/stack_items.dmi' + icon_state = "robofoam" + inhand_icon_state = "implantcase" + applicable_wounds = list( + /datum/wound/blunt/robotic, + ) + max_amount = 2 + amount = 2 + merge_type = /obj/item/stack/medical/wound_recovery/robofoam + treatment_sound = 'sound/effects/spray.ogg' + causes_pain = FALSE + +/obj/item/stack/medical/wound_recovery/robofoam/examine(mob/user) + . = ..() + . += span_notice("This cheaper foam can only be used to fill structural wounds on synthetics.") + return . + +/obj/item/stack/medical/wound_recovery/robofoam/post_heal_effects(amount_healed, mob/living/carbon/healed_mob, mob/user) + . = ..() + healed_mob.reagents.add_reagent(/datum/reagent/medicine/nanite_slurry, 5) + healed_mob.reagents.add_reagent(/datum/reagent/medicine/coagulant/fabricated, 5) + +// Used to cure practically any synthetic wound +/obj/item/stack/medical/wound_recovery/robofoam_super + name = "premium robotic repair spray" + singular_name = "premium robotic repair spray" + desc = "A needle-tip foam gun filled with an advanced synthetic foam that rapidly \ + fills and stabilizes structural damage in synthetics. The damaged area will be \ + vulnerable to further damage while the foam hardens. \ + This special premium type can also be used to repair almost any possible type \ + of synthetic damage." + icon = 'modular_skyrat/modules/deforest_medical_items/icons/stack_items.dmi' + icon_state = "robofoam_super" + inhand_icon_state = "implantcase" + applicable_wounds = list( + /datum/wound/blunt/robotic, + /datum/wound/muscle/robotic, + /datum/wound/electrical_damage, + /datum/wound/burn/robotic, + ) + max_amount = 2 + amount = 2 + merge_type = /obj/item/stack/medical/wound_recovery/robofoam_super + treatment_sound = 'sound/effects/spray.ogg' + causes_pain = FALSE + +/obj/item/stack/medical/wound_recovery/robofoam_super/examine(mob/user) + . = ..() + . += span_notice("This more expensive foam can be used to fill any type of wound on synthetics.") + return . + +/obj/item/stack/medical/wound_recovery/robofoam_super/post_heal_effects(amount_healed, mob/living/carbon/healed_mob, mob/user) + . = ..() + healed_mob.reagents.add_reagent(/datum/reagent/medicine/coagulant/fabricated, 5) + healed_mob.reagents.add_reagent(/datum/reagent/medicine/nanite_slurry, 5) + healed_mob.reagents.add_reagent(/datum/reagent/dinitrogen_plasmide, 5) + +// Synth repair patch, gives the synth a small amount of healing chems +/obj/item/reagent_containers/pill/robotic_patch + name = "robotic patch" + desc = "A chemical patch for touch-based applications on synthetics." + icon = 'modular_skyrat/modules/deforest_medical_items/icons/stack_items.dmi' + icon_state = "synth_patch" + inhand_icon_state = null + possible_transfer_amounts = list() + volume = 40 + apply_type = PATCH + apply_method = "apply" + self_delay = 3 SECONDS + dissolvable = FALSE + +/obj/item/reagent_containers/pill/robotic_patch/attack(mob/living/L, mob/user) + if(ishuman(L)) + var/obj/item/bodypart/affecting = L.get_bodypart(check_zone(user.zone_selected)) + if(!affecting) + to_chat(user, span_warning("The limb is missing!")) + return + if(!IS_ROBOTIC_LIMB(affecting)) + to_chat(user, span_notice("Robotic patches won't work on an organic limb!")) + return + return ..() + +/obj/item/reagent_containers/pill/robotic_patch/canconsume(mob/eater, mob/user) + if(!iscarbon(eater)) + return FALSE + return TRUE + +// The actual patch +/obj/item/reagent_containers/pill/robotic_patch/synth_repair + name = "robotic repair patch" + desc = "A sealed patch with a small nanite swarm along with electrical coagulant reagents to repair small amounts of synthetic damage." + icon_state = "synth_patch" + list_reagents = list( + /datum/reagent/medicine/nanite_slurry = 10, + /datum/reagent/dinitrogen_plasmide = 5, + /datum/reagent/medicine/coagulant/fabricated = 10, + ) diff --git a/modular_skyrat/modules/deforest_medical_items/code/vendor.dm b/modular_skyrat/modules/deforest_medical_items/code/vendor.dm index 9a9a412b975..af515fe3b2d 100644 --- a/modular_skyrat/modules/deforest_medical_items/code/vendor.dm +++ b/modular_skyrat/modules/deforest_medical_items/code/vendor.dm @@ -22,8 +22,11 @@ /obj/item/stack/medical/mesh = 4, /obj/item/stack/medical/mesh/bloody = 2, /obj/item/stack/medical/bandage = 4, + /obj/item/reagent_containers/pill/robotic_patch/synth_repair = 4, /obj/item/stack/medical/wound_recovery = 2, /obj/item/stack/medical/wound_recovery/rapid_coagulant = 2, + /obj/item/stack/medical/wound_recovery/robofoam = 2, + /obj/item/stack/medical/wound_recovery/robofoam_super = 1, /obj/item/storage/pill_bottle/painkiller = 4, /obj/item/storage/medkit/civil_defense/stocked = 2, ), @@ -42,6 +45,8 @@ /obj/item/reagent_containers/hypospray/medipen/deforest/lepoturi = 3, /obj/item/reagent_containers/hypospray/medipen/deforest/psifinil = 3, /obj/item/reagent_containers/hypospray/medipen/deforest/halobinin = 3, + /obj/item/reagent_containers/hypospray/medipen/deforest/robot_system_cleaner = 3, + /obj/item/reagent_containers/hypospray/medipen/deforest/robot_liquid_solder = 3, ), ), ) diff --git a/modular_skyrat/modules/deforest_medical_items/icons/injectors.dmi b/modular_skyrat/modules/deforest_medical_items/icons/injectors.dmi index af5232f05b4..8ee669c0bc6 100644 Binary files a/modular_skyrat/modules/deforest_medical_items/icons/injectors.dmi and b/modular_skyrat/modules/deforest_medical_items/icons/injectors.dmi differ diff --git a/modular_skyrat/modules/deforest_medical_items/icons/stack_items.dmi b/modular_skyrat/modules/deforest_medical_items/icons/stack_items.dmi index 947d1a088d5..c9e82f1375f 100644 Binary files a/modular_skyrat/modules/deforest_medical_items/icons/stack_items.dmi and b/modular_skyrat/modules/deforest_medical_items/icons/stack_items.dmi differ diff --git a/modular_skyrat/modules/deforest_medical_items/icons/storage.dmi b/modular_skyrat/modules/deforest_medical_items/icons/storage.dmi index dbf16b730d7..db9af62183a 100644 Binary files a/modular_skyrat/modules/deforest_medical_items/icons/storage.dmi and b/modular_skyrat/modules/deforest_medical_items/icons/storage.dmi differ diff --git a/modular_skyrat/modules/digitigrade_cybernetics/code/mechfabricator_designs.dm b/modular_skyrat/modules/digitigrade_cybernetics/code/mechfabricator_designs.dm index bb4529c8597..59734073e97 100644 --- a/modular_skyrat/modules/digitigrade_cybernetics/code/mechfabricator_designs.dm +++ b/modular_skyrat/modules/digitigrade_cybernetics/code/mechfabricator_designs.dm @@ -1,4 +1,5 @@ #define RND_SUBCATEGORY_MECHFAB_CYBORG_DIGI "/Digitigrade" +#define RND_SUBCATEGORY_CYBERNETICS_ADVANCED_DIGI "/Advanced Digitigrade" /datum/design/digitigrade_cyber_r_leg name = "Digitigrade Cybernetic Right Leg" @@ -34,7 +35,7 @@ ) construction_time = 20 SECONDS category = list( - RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_DIGI + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ADVANCED_DIGI ) /datum/design/digitigrade_adv_l_leg @@ -49,5 +50,5 @@ ) construction_time = 20 SECONDS category = list( - RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_DIGI + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ADVANCED_DIGI ) diff --git a/modular_skyrat/modules/goofsec/code/sec_clothing_overrides.dm b/modular_skyrat/modules/goofsec/code/sec_clothing_overrides.dm index 65ab673953e..7aff56e7051 100644 --- a/modular_skyrat/modules/goofsec/code/sec_clothing_overrides.dm +++ b/modular_skyrat/modules/goofsec/code/sec_clothing_overrides.dm @@ -589,13 +589,24 @@ unique_reskin = null // prevents you from losing the unique sprite /obj/item/clothing/under/rank/security/officer/skirt - name = "security battle dress" - desc = "An asymmetrical, unisex uniform with the legs replaced by a utility skirt." - worn_icon_state = "security_skirt" - icon_state = "security_skirt" - uses_advanced_reskins = FALSE - unique_reskin = null - alt_covers_chest = FALSE + name = "security jumpskirt" + desc = "Turtleneck sweater commonly worn by Peacekeepers, attached with a skirt." + icon = 'modular_skyrat/master_files/icons/obj/clothing/under/security.dmi' + worn_icon = 'modular_skyrat/master_files/icons/mob/clothing/under/security.dmi' + icon_state = "jumpskirt_blue" + female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY + gets_cropped_on_taurs = FALSE + uses_advanced_reskins = TRUE + unique_reskin = list( + "Blue Variant" = list( + RESKIN_ICON_STATE = "jumpskirt_blue", + RESKIN_WORN_ICON_STATE = "jumpskirt_blue" + ), + "Black Variant" = list( + RESKIN_ICON_STATE = "jumpskirt_black", + RESKIN_WORN_ICON_STATE = "jumpskirt_black" + ), + ) //Warden /obj/item/clothing/under/rank/security/warden diff --git a/modular_skyrat/modules/icemoon_additions/code/icecat_recipes.dm b/modular_skyrat/modules/icemoon_additions/code/icecat_recipes.dm index 8467bb2f929..3bf5c38e431 100644 --- a/modular_skyrat/modules/icemoon_additions/code/icecat_recipes.dm +++ b/modular_skyrat/modules/icemoon_additions/code/icecat_recipes.dm @@ -54,9 +54,8 @@ /datum/crafting_recipe/anointing_oil name = "Anointing Bloodresin" category = CAT_MISC - //recipe given to icecats as part of their spawner/team setting - always_available = FALSE + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED reqs = list( /datum/reagent/consumable/liquidgibs = 80, 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 4891323c05c..7444d9618ac 100644 --- a/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_suit.dm +++ b/modular_skyrat/modules/loadouts/loadout_items/loadout_datum_suit.dm @@ -120,6 +120,14 @@ GLOBAL_LIST_INIT(loadout_exosuits, generate_loadout_items(/datum/loadout_item/su name = "Medical Labcoat" item_path = /obj/item/clothing/suit/toggle/labcoat/medical +/datum/loadout_item/suit/labcoat_regular + name = "Researcher's Labcoat" + item_path = /obj/item/clothing/suit/toggle/labcoat/skyrat/regular + +/datum/loadout_item/suit/labcoat_pharmacist + name = "Pharmacist's Labcoat" + item_path = /obj/item/clothing/suit/toggle/labcoat/skyrat/pharmacist + /* * PONCHOS */ 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 2bef400c267..4efac1f50e3 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 @@ -109,11 +109,41 @@ GLOBAL_LIST_INIT(loadout_miscunders, generate_loadout_items(/datum/loadout_item/ name = "Grey Officer's Naval Jumpsuit (Trousers)" item_path = /obj/item/clothing/under/rank/captain/skyrat/imperial/generic/pants +/datum/loadout_item/under/jumpsuit/security_skirt + name = "Security Battledress" + item_path = /obj/item/clothing/under/rank/security/peacekeeper/skirt + restricted_roles = list(JOB_SECURITY_OFFICER, JOB_WARDEN, JOB_HEAD_OF_SECURITY) + /datum/loadout_item/under/jumpsuit/security_trousers name = "Security Trousers" item_path = /obj/item/clothing/under/rank/security/peacekeeper/trousers restricted_roles = list(JOB_SECURITY_OFFICER, JOB_WARDEN, JOB_HEAD_OF_SECURITY, JOB_SECURITY_MEDIC) +/datum/loadout_item/under/jumpsuit/security_shorts + name = "Security Shorts" + item_path = /obj/item/clothing/under/rank/security/peacekeeper/trousers/shorts + restricted_roles = list(JOB_SECURITY_OFFICER, JOB_WARDEN, JOB_HEAD_OF_SECURITY) + +/datum/loadout_item/under/jumpsuit/security_jumpskirt + name = "Security Jumpskirt" + item_path = /obj/item/clothing/under/rank/security/officer/skirt + restricted_roles = list(JOB_SECURITY_OFFICER, JOB_WARDEN, JOB_HEAD_OF_SECURITY) + +/datum/loadout_item/under/jumpsuit/security_shortskirt + name = "Security Shortskirt" + item_path = /obj/item/clothing/under/rank/security/peacekeeper/shortskirt + restricted_roles = list(JOB_SECURITY_OFFICER, JOB_WARDEN, JOB_HEAD_OF_SECURITY) + +/datum/loadout_item/under/jumpsuit/security_miniskirt + name = "Security Miniskirt" + item_path = /obj/item/clothing/under/rank/security/peacekeeper/miniskirt + restricted_roles = list(JOB_SECURITY_OFFICER, JOB_WARDEN, JOB_HEAD_OF_SECURITY) + +/datum/loadout_item/under/jumpsuit/security_jumpsuit + name = "Security Jumpsuit" + item_path = /obj/item/clothing/under/rank/security/peacekeeper/jumpsuit + restricted_roles = list(JOB_SECURITY_OFFICER, JOB_WARDEN, JOB_HEAD_OF_SECURITY) + /datum/loadout_item/under/jumpsuit/security_peacekeeper name = "Security Peacekeeper Uniform" item_path = /obj/item/clothing/under/rank/security/peacekeeper diff --git a/modular_skyrat/modules/mapping/code/spaceship_items.dm b/modular_skyrat/modules/mapping/code/spaceship_items.dm index d6c03401613..55851a65736 100644 --- a/modular_skyrat/modules/mapping/code/spaceship_items.dm +++ b/modular_skyrat/modules/mapping/code/spaceship_items.dm @@ -19,7 +19,7 @@ merge_type = /obj/item/stack/sheet/spaceshipglass GLOBAL_LIST_INIT(spaceshipglass_recipes, list( - new/datum/stack_recipe("spaceship window", /obj/structure/window/reinforced/shuttle/spaceship/unanchored, 2, time = 4 SECONDS, on_solid_ground = TRUE, is_fulltile = TRUE, category = CAT_WINDOWS), \ + new/datum/stack_recipe("spaceship window", /obj/structure/window/reinforced/shuttle/spaceship/unanchored, 2, time = 4 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ON_SOLID_GROUND | CRAFT_IS_FULLTILE, category = CAT_WINDOWS), \ )) /obj/item/stack/sheet/spaceshipglass/get_main_recipes() diff --git a/modular_skyrat/modules/medical/code/cargo/packs.dm b/modular_skyrat/modules/medical/code/cargo/packs.dm index 58259bc4568..0ad1d2ba84c 100644 --- a/modular_skyrat/modules/medical/code/cargo/packs.dm +++ b/modular_skyrat/modules/medical/code/cargo/packs.dm @@ -39,16 +39,10 @@ name = "Mechanical Repair Kits" desc = "Contains a few low-grade portable synthetic medkits, useful for distributing to the crew." cost = CARGO_CRATE_VALUE * 4.5 // same as treatment kits - contains = list(/obj/item/storage/medkit/mechanical/regular = 4) + contains = list(/obj/item/storage/medkit/robotic_repair/stocked = 4) crate_name = "synthetic repair kits crate" access_view = FALSE access = FALSE access_any = FALSE - -/datum/supply_pack/goody/mechanical_repair_kit_single - name = "Mechanical Repair Kit Single-Pack" - desc = "A single mechanical repair kit, fit for fixing most robotic injuries." - cost = PAYCHECK_CREW * 3 - contains = list(/obj/item/storage/medkit/mechanical/regular) diff --git a/modular_skyrat/modules/medical/code/medkit.dm b/modular_skyrat/modules/medical/code/medkit.dm index fe496ea8f76..eb416abd688 100644 --- a/modular_skyrat/modules/medical/code/medkit.dm +++ b/modular_skyrat/modules/medical/code/medkit.dm @@ -212,47 +212,3 @@ atom_storage.set_holdable(list_of_everything_mechanical_medkits_can_hold) LAZYINITLIST(atom_storage.exception_hold) atom_storage.exception_hold = atom_storage.exception_hold + exception_cache - -/obj/item/storage/medkit/mechanical/regular - name = "mechanical repair kit" - desc = "Used to treat injuries sustained by mechanical limbs/lifeforms." - -/obj/item/storage/medkit/mechanical/regular/PopulateContents() - if(empty) - return - var/static/items_inside = list( - /obj/item/stack/medical/gauze = 1, - /obj/item/stack/cable_coil = 2, - /obj/item/weldingtool/mini = 1, - /obj/item/clothing/head/utility/welding = 1, - /obj/item/reagent_containers/hypospray/medipen = 1, // treats electrical damage - /obj/item/healthanalyzer/simple = 1, - ) - generate_items_inside(items_inside,src) - -/obj/item/storage/medkit/mechanical/roboticist - name = "intensive repair kit" - desc = "A high capacity repair kit for roboticists, used to treat injuries sustained by mechanical lifeforms." - icon_state = "medkit_robo" - -/obj/item/storage/medkit/mechanical/roboticist/Initialize(mapload) - . = ..() - atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL //holds the same equipment as a medibelt - atom_storage.max_slots = 12 - atom_storage.max_total_storage = 24 - -/obj/item/storage/medkit/mechanical/roboticist/PopulateContents() - if(empty) - return - var/static/items_inside = list( - /obj/item/stack/medical/gauze = 2, - /obj/item/stack/cable_coil = 4, - /obj/item/storage/pill_bottle/nanite_slurry = 1, - /obj/item/storage/pill_bottle/system_cleaner = 1, - /obj/item/reagent_containers/spray/hercuri/chilled = 1, - /obj/item/reagent_containers/spray/dinitrogen_plasmide = 1, - /obj/item/reagent_containers/hypospray/medipen = 1, // treats electrical damage - /obj/item/healthanalyzer/simple = 1, - /obj/item/healthanalyzer/no_medibot = 1, // no welding tool since we assume you already have one - ) - generate_items_inside(items_inside,src) diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/_erp_disabled_item_enforcement.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/_erp_disabled_item_enforcement.dm index ae31c91448d..176e615653f 100644 --- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/_erp_disabled_item_enforcement.dm +++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/_erp_disabled_item_enforcement.dm @@ -227,3 +227,8 @@ . = ..() if(CONFIG_GET(flag/disable_lewd_items)) return INITIALIZE_HINT_QDEL + +/obj/item/clothing/erp_leash/Initialize(mapload) + . = ..() + if(CONFIG_GET(flag/disable_lewd_items)) + return INITIALIZE_HINT_QDEL diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/leash.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/leash.dm new file mode 100644 index 00000000000..7f242ea05b8 --- /dev/null +++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_items/leash.dm @@ -0,0 +1,135 @@ +/obj/item/clothing/erp_leash + name = "leash" + desc = "A guiding hand's best friend; in a sleek, semi-elastic package. Can either clip to a collar or be affixed to the neck on its own." + icon = 'modular_skyrat/modules/modular_items/lewd_items/icons/obj/lewd_clothing/lewd_belts.dmi' + worn_icon = 'modular_skyrat/modules/modular_items/lewd_items/icons/mob/lewd_clothing/lewd_belts.dmi' + icon_state = "neckleash_pink" + equip_sound = 'sound/items/equip/toolbelt_equip.ogg' + drop_sound = 'sound/items/handling/toolbelt_drop.ogg' + slot_flags = ITEM_SLOT_BELT + breakouttime = 3 SECONDS + /// Weakref to the leash component we're using, if it exists. + var/datum/weakref/our_leash_component + + unique_reskin = list( + "Pink" = "neckleash_pink", + "Teal" = "neckleash_teal", + ) + + COOLDOWN_DECLARE(tug_cd) + +/// HERE BE DRAGONS /// + +/// Checks; leashing start +/obj/item/clothing/erp_leash/attack(mob/living/carbon/human/to_be_leashed, mob/living/user, params) + var/datum/component/leash/erp/the_leash_component = our_leash_component?.resolve() + if(the_leash_component) + if(the_leash_component.parent == to_be_leashed) // We're hooked to them; and we have a component. Get 'em out! + remove_leash(to_be_leashed) + return + else + our_leash_component = null + /// Check if we even CAN leash someone / if someone is leashing themselves. If so; prevent it. + if(!istype(to_be_leashed) || user == to_be_leashed) + return + /// Check their ERP prefs; if they don't allow sextoys: BTFO + if(!to_be_leashed.check_erp_prefs(/datum/preference/toggle/erp/sex_toy, user, src)) + to_chat(user, span_danger("[to_be_leashed] doesn't want you to do that.")) + return + /// Actually start the leashing part here + to_be_leashed.visible_message(span_warning("[user] raises the [src] to [to_be_leashed]'s neck!"),\ + span_userdanger("[user] starts to bring the [src] to your neck!"),\ + span_hear("You hear a light click as pressure builds in the air around your neck.")) + if(!do_after(user, 2 SECONDS, to_be_leashed)) + return + create_leash(user, to_be_leashed) + +/// Leash Initialization +/obj/item/clothing/erp_leash/proc/create_leash(mob/user, mob/ouppy) + if(!istype(ouppy)) + return + + ouppy.AddComponent(/datum/component/leash/erp, src, 2) + if(our_leash_component.resolve()) // The component will immediately delete itself if there's an existing one; this sanity checks for feedback on if it failed. + ouppy.balloon_alert(user, "leashed!") + return + else to_chat(user, span_danger("There's a leash attached to [ouppy] already.")) + +/// Leash removal +/obj/item/clothing/erp_leash/proc/remove_leash(mob/free_bird) + free_bird?.balloon_alert_to_viewers("unhooked") + qdel(our_leash_component.resolve()) + +/* + Leash Component +*/ + +/datum/component/leash/erp + dupe_mode = COMPONENT_DUPE_UNIQUE + dupe_type = /datum/component/leash + +// 'owner' refers the leash item, while 'parent' refers to the one it's affixed to. +/datum/component/leash/erp/RegisterWithParent() + . = ..() + // Owner Signals + RegisterSignal(owner, COMSIG_ITEM_ATTACK_SELF, PROC_REF(on_item_attack_self)) + RegisterSignal(owner, COMSIG_ITEM_DROPPED, PROC_REF(on_item_dropped)) + // Parent Signals + RegisterSignal(parent, COMSIG_LIVING_RESIST, PROC_REF(on_parent_resist)) + if(istype(owner, /obj/item/clothing/erp_leash)) + var/obj/item/clothing/erp_leash/our_leash = owner + our_leash.our_leash_component = WEAKREF(src) + +/datum/component/leash/erp/UnregisterFromParent() + if(owner) // Destroy() sets owner to null + UnregisterSignal(owner, list(COMSIG_ITEM_ATTACK_SELF, COMSIG_ITEM_DROPPED)) + UnregisterSignal(parent, COMSIG_LIVING_RESIST) + return ..() + +/datum/component/leash/erp/Destroy() // Have to do this here too + UnregisterSignal(owner, list(COMSIG_ITEM_ATTACK_SELF, COMSIG_ITEM_DROPPED)) + if(istype(owner, /obj/item/clothing/erp_leash)) + var/obj/item/clothing/erp_leash/our_leash = owner + our_leash.our_leash_component = null + return ..() + + +/datum/component/leash/erp/proc/on_item_attack_self(datum/source, mob/user) + SIGNAL_HANDLER + + if(istype(source, /obj/item/clothing/erp_leash)) + var/obj/item/clothing/erp_leash/leash_hookin = source + if(!COOLDOWN_FINISHED(leash_hookin, tug_cd)) + return + if(istype(parent, /mob/living)) + var/mob/living/yoinked = parent + yoinked.Move(get_step_towards(yoinked,user)) + yoinked.adjustStaminaLoss(10) + yoinked.visible_message(span_warning("[yoinked] is pulled in as [user] tugs the [source]!"),\ + span_userdanger("[user] suddenly tugs the [source], pulling you closer!"),\ + span_userdanger("A sudden tug against your neck pulls you ahead!")) + COOLDOWN_START(leash_hookin, tug_cd, 1 SECONDS) + +/datum/component/leash/erp/proc/on_item_dropped(datum/source, mob/user) + SIGNAL_HANDLER + + if(istype(parent, /mob)) + var/mob/our_parent = parent + our_parent.balloon_alert_to_viewers("unhooked") + qdel(src) + +/datum/component/leash/erp/proc/on_parent_resist(datum/source, mob/user) + SIGNAL_HANDLER + INVOKE_ASYNC(src, PROC_REF(do_resist)) + +/datum/component/leash/erp/proc/do_resist(datum/source, mob/user) + if(istype(parent, /mob) && istype(owner,/obj/item)) + var/mob/our_parent = parent + var/obj/item/our_owner = owner + our_parent.visible_message(span_warning("[our_parent] attempts to unhook [our_parent.p_them()]self from the leash!"), \ + span_userdanger("You start to unhook yourself from the leash..."), \ + span_userdanger("You fumble in the dark, looking to unhook the leash...")) + if(do_after(our_parent, our_owner.breakouttime, target = our_parent)) + to_chat(our_parent, span_notice("You unhook yourself from the leash.")) + qdel(src) + else qdel(src) // If they're not an item; something is very wrong - qdel anyways without the breakout time. diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_machinery/lustwish.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_machinery/lustwish.dm index 5eb71d6d23e..9c0d65f6789 100644 --- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_machinery/lustwish.dm +++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_machinery/lustwish.dm @@ -101,6 +101,7 @@ //neck /obj/item/key/collar = 48, + /obj/item/clothing/erp_leash = 8, /obj/item/clothing/neck/kink_collar = 8, /obj/item/clothing/neck/human_petcollar = 8, /obj/item/clothing/neck/human_petcollar/choker = 8, diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/verbs.dm b/modular_skyrat/modules/modular_items/lewd_items/code/verbs.dm index ffdf2bcaffd..bbea5efac11 100644 --- a/modular_skyrat/modules/modular_items/lewd_items/code/verbs.dm +++ b/modular_skyrat/modules/modular_items/lewd_items/code/verbs.dm @@ -54,6 +54,11 @@ log_message("[equipped_item] was removed from [key_name(src)].", LOG_ATTACK) dropItemToGround(equipped_item, TRUE) + // Leashes are treated a smidge different than the rest of the clothing; and need their own handling here. + var/leash_check = src?.GetComponent(/datum/component/leash/erp) + if(leash_check) + qdel(leash_check) + return TRUE /mob/living/carbon/human/verb/lick(mob/living/carbon/human/target in get_adjacent_humans()) diff --git a/modular_skyrat/modules/modular_vending/code/wardrobes.dm b/modular_skyrat/modules/modular_vending/code/wardrobes.dm index 5eee806a55f..4e553ed712a 100644 --- a/modular_skyrat/modules/modular_vending/code/wardrobes.dm +++ b/modular_skyrat/modules/modular_vending/code/wardrobes.dm @@ -126,6 +126,9 @@ skyrat_products = list( /obj/item/clothing/under/rank/medical/chemist/skyrat/formal = 2, /obj/item/clothing/under/rank/medical/chemist/skyrat/formal/skirt = 2, + /obj/item/clothing/under/rank/medical/chemist/skyrat/formal = 2, + /obj/item/clothing/under/rank/medical/chemist/skyrat/formal/skirt = 2, + /obj/item/clothing/suit/toggle/labcoat/skyrat/pharmacist = 2, /obj/item/clothing/head/beret/medical/chemist = 2, /obj/item/storage/backpack/messenger/chem = 2, ) diff --git a/modular_skyrat/modules/organs/code/tongue.dm b/modular_skyrat/modules/organs/code/tongue.dm index 7b4cdef0744..3746d67b5d2 100644 --- a/modular_skyrat/modules/organs/code/tongue.dm +++ b/modular_skyrat/modules/organs/code/tongue.dm @@ -27,6 +27,20 @@ speaker.verb_sing = initial(verb_sing) speaker.verb_yell = initial(verb_yell) +/obj/item/organ/internal/tongue/cat/Insert(mob/living/carbon/signer, special = FALSE, movement_flags = DELETE_IF_REPLACED) + . = ..() + signer.verb_ask = "mrrps" + signer.verb_exclaim = "mrrowls" + signer.verb_whisper = "purrs" + signer.verb_yell = "yowls" + +/obj/item/organ/internal/tongue/cat/Remove(mob/living/carbon/speaker, special = FALSE) + . = ..() + speaker.verb_ask = initial(verb_ask) + speaker.verb_exclaim = initial(verb_exclaim) + speaker.verb_whisper = initial(verb_whisper) + speaker.verb_yell = initial(verb_yell) + /obj/item/organ/internal/tongue/avian name = "avian tongue" desc = "A short and stubby tongue that craves seeds." diff --git a/modular_skyrat/modules/primitive_production/code/ceramics.dm b/modular_skyrat/modules/primitive_production/code/ceramics.dm index ab360765ac3..b04fdad9fa5 100644 --- a/modular_skyrat/modules/primitive_production/code/ceramics.dm +++ b/modular_skyrat/modules/primitive_production/code/ceramics.dm @@ -16,8 +16,8 @@ merge_type = /obj/item/stack/sheet/mineral/clay GLOBAL_LIST_INIT(clay_recipes, list ( \ - new/datum/stack_recipe("clay range", /obj/machinery/primitive_stove, 10, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_MISC), \ - new/datum/stack_recipe("clay oven", /obj/machinery/oven/stone, 10, time = 5 SECONDS, one_per_turf = FALSE, on_solid_ground = TRUE, category = CAT_MISC) \ + new/datum/stack_recipe("clay range", /obj/machinery/primitive_stove, 10, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_MISC), \ + new/datum/stack_recipe("clay oven", /obj/machinery/oven/stone, 10, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_MISC) \ )) /obj/item/stack/sheet/mineral/clay/get_main_recipes() diff --git a/modular_skyrat/modules/sec_haul/code/misc/vending.dm b/modular_skyrat/modules/sec_haul/code/misc/vending.dm index 14cbec1c4f9..ea667fe7055 100644 --- a/modular_skyrat/modules/sec_haul/code/misc/vending.dm +++ b/modular_skyrat/modules/sec_haul/code/misc/vending.dm @@ -53,6 +53,10 @@ /obj/item/storage/backpack/duffelbag/sec = 5, /obj/item/clothing/under/rank/security/officer = 10, /obj/item/clothing/under/rank/security/officer/skirt = 10, + /obj/item/clothing/under/rank/security/peacekeeper/skirt = 10, + /obj/item/clothing/under/rank/security/peacekeeper/shortskirt = 10, + /obj/item/clothing/under/rank/security/peacekeeper/miniskirt = 10, + /obj/item/clothing/under/rank/security/peacekeeper/jumpsuit = 10, /obj/item/clothing/under/rank/security/peacekeeper = 10, /obj/item/clothing/under/rank/security/skyrat/utility = 3, /obj/item/clothing/shoes/jackboots/sec = 10, diff --git a/modular_skyrat/modules/stone/code/stone.dm b/modular_skyrat/modules/stone/code/stone.dm index ac36480ac79..6f4046006c0 100644 --- a/modular_skyrat/modules/stone/code/stone.dm +++ b/modular_skyrat/modules/stone/code/stone.dm @@ -18,12 +18,12 @@ stairs_type = /obj/structure/stairs/stone GLOBAL_LIST_INIT(stone_recipes, list ( \ - new/datum/stack_recipe("stone brick wall", /turf/closed/wall/mineral/stone, 5, one_per_turf = 1, on_solid_ground = 1, applies_mats = TRUE, category = CAT_STRUCTURE), \ - new/datum/stack_recipe("stone brick tile", /obj/item/stack/tile/mineral/stone, 1, 4, 20, check_density = FALSE, category = CAT_TILES), - new/datum/stack_recipe("millstone", /obj/structure/millstone, 6, one_per_turf = 1, on_solid_ground = 1, category = CAT_STRUCTURE), - new/datum/stack_recipe("stone stove", /obj/machinery/primitive_stove, 5, one_per_turf = 1, on_solid_ground = 1, category = CAT_STRUCTURE), - new/datum/stack_recipe("stone oven", /obj/machinery/oven/stone, 5, one_per_turf = 1, on_solid_ground = 1, category = CAT_STRUCTURE), - new/datum/stack_recipe("stone griddle", /obj/machinery/griddle/stone, 5, one_per_turf = 1, on_solid_ground = 1, category = CAT_STRUCTURE), + new/datum/stack_recipe("stone brick wall", /turf/closed/wall/mineral/stone, 5, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND | CRAFT_APPLIES_MATS, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("stone brick tile", /obj/item/stack/tile/mineral/stone, 1, 4, 20, category = CAT_TILES), + new/datum/stack_recipe("millstone", /obj/structure/millstone, 6, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_STRUCTURE), + new/datum/stack_recipe("stone stove", /obj/machinery/primitive_stove, 5, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_STRUCTURE), + new/datum/stack_recipe("stone oven", /obj/machinery/oven/stone, 5, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_STRUCTURE), + new/datum/stack_recipe("stone griddle", /obj/machinery/griddle/stone, 5, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_STRUCTURE), )) /obj/item/stack/sheet/mineral/stone/get_main_recipes() diff --git a/modular_skyrat/modules/synths/code/reagents/reagents.dm b/modular_skyrat/modules/synths/code/reagents/reagents.dm index b0ab99d0203..3fa4119bcf5 100644 --- a/modular_skyrat/modules/synths/code/reagents/reagents.dm +++ b/modular_skyrat/modules/synths/code/reagents/reagents.dm @@ -59,7 +59,7 @@ process_flags = REAGENT_SYNTHETIC | REAGENT_ORGANIC chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /// How much brute and burn individually is healed per tick - var/healing = 2 + var/healing = 3 /// How much body temperature is increased by per overdose cycle on robotic bodyparts. var/temperature_change = 50 diff --git a/modular_skyrat/modules/tesh_augments/code/mechfabricator_designs.dm b/modular_skyrat/modules/tesh_augments/code/mechfabricator_designs.dm index 50fdb0865ba..cdb8c7e632d 100644 --- a/modular_skyrat/modules/tesh_augments/code/mechfabricator_designs.dm +++ b/modular_skyrat/modules/tesh_augments/code/mechfabricator_designs.dm @@ -1,6 +1,7 @@ //adding teshari silicon stuff to the mechfabricator #define RND_SUBCATEGORY_MECHFAB_CYBORG_RAPTORAL "/Raptoral" +#define RND_SUBCATEGORY_CYBERNETICS_ADVANCED_RAPTORAL "/Advanced Raptoral Limbs" /datum/design/teshari_cyber_chest name = "Raptoral Cybernetic Torso" @@ -82,7 +83,7 @@ ) construction_time = 8 SECONDS category = list( - RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_RAPTORAL, + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ADVANCED_RAPTORAL, ) /datum/design/teshari_advanced_r_arm @@ -97,7 +98,7 @@ ) construction_time = 8 SECONDS category = list( - RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_RAPTORAL, + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ADVANCED_RAPTORAL, ) /datum/design/teshari_advanced_l_leg @@ -112,7 +113,7 @@ ) construction_time = 8 SECONDS category = list( - RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_RAPTORAL, + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ADVANCED_RAPTORAL, ) /datum/design/teshari_advanced_r_leg @@ -127,5 +128,5 @@ ) construction_time = 8 SECONDS category = list( - RND_CATEGORY_MECHFAB_CYBORG + RND_SUBCATEGORY_MECHFAB_CYBORG_RAPTORAL, + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ADVANCED_RAPTORAL, ) diff --git a/modular_skyrat/modules/tribal_extended/code/recipes.dm b/modular_skyrat/modules/tribal_extended/code/recipes.dm index fedb68faff5..e9739121276 100644 --- a/modular_skyrat/modules/tribal_extended/code/recipes.dm +++ b/modular_skyrat/modules/tribal_extended/code/recipes.dm @@ -86,7 +86,7 @@ /obj/item/stack/sheet/sinew = 2, ) time = 4 SECONDS - always_available = FALSE + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED category = CAT_WEAPON_MELEE /datum/crafting_recipe/quiver diff --git a/tgstation.dme b/tgstation.dme index 2de00849a46..ff298b76b10 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -117,6 +117,7 @@ #include "code\__DEFINES\instruments.dm" #include "code\__DEFINES\interaction_flags.dm" #include "code\__DEFINES\inventory.dm" +#include "code\__DEFINES\ipintel.dm" #include "code\__DEFINES\is_helpers.dm" #include "code\__DEFINES\jobs.dm" #include "code\__DEFINES\keybinding.dm" @@ -608,10 +609,8 @@ #include "code\__HELPERS\paths\jps.dm" #include "code\__HELPERS\paths\path.dm" #include "code\__HELPERS\paths\sssp.dm" -#include "code\__HELPERS\sorts\__main.dm" -#include "code\__HELPERS\sorts\InsertSort.dm" -#include "code\__HELPERS\sorts\MergeSort.dm" -#include "code\__HELPERS\sorts\TimSort.dm" +#include "code\__HELPERS\sorts\helpers.dm" +#include "code\__HELPERS\sorts\sort_instance.dm" #include "code\__HELPERS\~skyrat_helpers\is_helpers.dm" #include "code\__HELPERS\~skyrat_helpers\level_traits.dm" #include "code\__HELPERS\~skyrat_helpers\logging.dm" @@ -1503,6 +1502,7 @@ #include "code\datums\elements\connect_loc.dm" #include "code\datums\elements\consumable_mob.dm" #include "code\datums\elements\content_barfer.dm" +#include "code\datums\elements\corrupted_organ.dm" #include "code\datums\elements\crackable.dm" #include "code\datums\elements\crusher_loot.dm" #include "code\datums\elements\cuffsnapping.dm" @@ -2906,7 +2906,6 @@ #include "code\modules\admin\fun_balloon.dm" #include "code\modules\admin\greyscale_modify_menu.dm" #include "code\modules\admin\holder2.dm" -#include "code\modules\admin\ipintel.dm" #include "code\modules\admin\IsBanned.dm" #include "code\modules\admin\known_alts.dm" #include "code\modules\admin\outfit_editor.dm" @@ -3177,6 +3176,7 @@ #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\corrupted_organs.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" @@ -3207,6 +3207,7 @@ #include "code\modules\antagonists\heretic\knowledge\starting_lore.dm" #include "code\modules\antagonists\heretic\knowledge\void_lore.dm" #include "code\modules\antagonists\heretic\knowledge\sacrifice_knowledge\sacrifice_buff.dm" +#include "code\modules\antagonists\heretic\knowledge\sacrifice_knowledge\sacrifice_curse.dm" #include "code\modules\antagonists\heretic\knowledge\sacrifice_knowledge\sacrifice_knowledge.dm" #include "code\modules\antagonists\heretic\knowledge\sacrifice_knowledge\sacrifice_map.dm" #include "code\modules\antagonists\heretic\knowledge\sacrifice_knowledge\sacrifice_moodlets.dm" @@ -3572,16 +3573,19 @@ #include "code\modules\bitrunning\event.dm" #include "code\modules\bitrunning\job.dm" #include "code\modules\bitrunning\outfits.dm" +#include "code\modules\bitrunning\spawners.dm" #include "code\modules\bitrunning\turfs.dm" #include "code\modules\bitrunning\antagonists\_parent.dm" #include "code\modules\bitrunning\antagonists\cyber_police.dm" #include "code\modules\bitrunning\antagonists\cyber_tac.dm" +#include "code\modules\bitrunning\antagonists\ghost_role.dm" #include "code\modules\bitrunning\antagonists\netguardian.dm" #include "code\modules\bitrunning\components\avatar_connection.dm" #include "code\modules\bitrunning\components\bitrunning_points.dm" #include "code\modules\bitrunning\components\glitch.dm" #include "code\modules\bitrunning\components\netpod_healing.dm" #include "code\modules\bitrunning\components\npc_friendly.dm" +#include "code\modules\bitrunning\components\virtual_entity.dm" #include "code\modules\bitrunning\objects\byteforge.dm" #include "code\modules\bitrunning\objects\clothing.dm" #include "code\modules\bitrunning\objects\debug.dm" @@ -3837,6 +3841,7 @@ #include "code\modules\client\verbs\ooc.dm" #include "code\modules\client\verbs\ping.dm" #include "code\modules\client\verbs\suicide.dm" +#include "code\modules\client\verbs\typing.dm" #include "code\modules\client\verbs\who.dm" #include "code\modules\clothing\clothing.dm" #include "code\modules\clothing\belts\polymorph_belt.dm" @@ -4480,13 +4485,13 @@ #include "code\modules\library\random_books.dm" #include "code\modules\library\skill_learning\skill_station.dm" #include "code\modules\library\skill_learning\skillchip.dm" +#include "code\modules\library\skill_learning\generic_skillchips\rod_suplex.dm" #include "code\modules\library\skill_learning\job_skillchips\_job.dm" #include "code\modules\library\skill_learning\job_skillchips\chef.dm" #include "code\modules\library\skill_learning\job_skillchips\clown.dm" #include "code\modules\library\skill_learning\job_skillchips\janitor.dm" #include "code\modules\library\skill_learning\job_skillchips\miner.dm" #include "code\modules\library\skill_learning\job_skillchips\psychologist.dm" -#include "code\modules\library\skill_learning\job_skillchips\research_director.dm" #include "code\modules\library\skill_learning\job_skillchips\roboticist.dm" #include "code\modules\library\skill_learning\job_skillchips\station_engineer.dm" #include "code\modules\lighting\lighting_area.dm" @@ -5471,6 +5476,7 @@ #include "code\modules\projectiles\ammunition\_firing.dm" #include "code\modules\projectiles\ammunition\ballistic\foam.dm" #include "code\modules\projectiles\ammunition\ballistic\harpoon.dm" +#include "code\modules\projectiles\ammunition\ballistic\junk.dm" #include "code\modules\projectiles\ammunition\ballistic\lmg.dm" #include "code\modules\projectiles\ammunition\ballistic\pistol.dm" #include "code\modules\projectiles\ammunition\ballistic\revolver.dm" @@ -5554,6 +5560,7 @@ #include "code\modules\projectiles\projectile\bullets\dnainjector.dm" #include "code\modules\projectiles\projectile\bullets\foam_dart.dm" #include "code\modules\projectiles\projectile\bullets\grenade.dm" +#include "code\modules\projectiles\projectile\bullets\junk.dm" #include "code\modules\projectiles\projectile\bullets\lmg.dm" #include "code\modules\projectiles\projectile\bullets\pistol.dm" #include "code\modules\projectiles\projectile\bullets\revolver.dm" @@ -7371,6 +7378,8 @@ #include "modular_skyrat\modules\deforest_medical_items\code\injectors.dm" #include "modular_skyrat\modules\deforest_medical_items\code\medstation.dm" #include "modular_skyrat\modules\deforest_medical_items\code\storage_items.dm" +#include "modular_skyrat\modules\deforest_medical_items\code\storage_items_robotics.dm" +#include "modular_skyrat\modules\deforest_medical_items\code\synth_healing.dm" #include "modular_skyrat\modules\deforest_medical_items\code\treatment_zone_projector.dm" #include "modular_skyrat\modules\deforest_medical_items\code\vendor.dm" #include "modular_skyrat\modules\deforest_medical_items\code\vulnerable_status_effect.dm" @@ -7832,6 +7841,7 @@ #include "modular_skyrat\modules\modular_items\lewd_items\code\lewd_items\feather.dm" #include "modular_skyrat\modules\modular_items\lewd_items\code\lewd_items\fleshlight.dm" #include "modular_skyrat\modules\modular_items\lewd_items\code\lewd_items\kinky_shocker.dm" +#include "modular_skyrat\modules\modular_items\lewd_items\code\lewd_items\leash.dm" #include "modular_skyrat\modules\modular_items\lewd_items\code\lewd_items\leather_whip.dm" #include "modular_skyrat\modules\modular_items\lewd_items\code\lewd_items\magic_wand.dm" #include "modular_skyrat\modules\modular_items\lewd_items\code\lewd_items\pinkcuffs.dm" diff --git a/tgui/packages/tgui/interfaces/ArmamentStation.jsx b/tgui/packages/tgui/interfaces/ArmamentStation.jsx index 08087f49de2..c223cd4eb5c 100644 --- a/tgui/packages/tgui/interfaces/ArmamentStation.jsx +++ b/tgui/packages/tgui/interfaces/ArmamentStation.jsx @@ -95,8 +95,8 @@ export const ArmamentStation = (props) => {  {item.name} @@ -119,15 +119,15 @@ export const ArmamentStation = (props) => { item.ref === weapon && ( - - src= - {`data:image/jpeg;base64,${item.icon}`} - height={'100%'} width={'100%'} style= - {{ - 'vertical-align': 'middle', - 'horizontal-align': 'middle', + + /> {item.description} ; + } + if (icon_state) { return ( { data.targetTemp + '°C'} - {(!data.open && 'Auto') || ( + {(!data.open && capitalize(data.mode)) || ( <>